51nod挑的部分5级题
2024-09-04 15:38:48
最近心情不好所以写代码来获得快落
4级题有点难做?然后就开始挑简单的5级题开始写
然后准备记录一些自己没有做出来
参考讨论区或者博客才做出来的题目
这个题参考了讨论区
令 t = n!
1/t = 1/x + 1/y , 0 < x <= y 的正整数解计数, n <= 1e6
考虑对式子进行变换
1/t = (x + y) / xy
xy = t * (x + y)
我们这时候应该有一个反应,配方有
(x - t) * (y - t) = t * t
所以考虑统计 t * t 的因子数就可以了
分解质因数即可
n, m, k = int(input()), 1, 1000000007
v = [0 for i in range(n + 1)]
p = [0 for i in range(n + 1)]
for i in range(2, n + 1):
if not v[i]:
p[0] += 1
p[p[0]] = i
t, j = 1, i
while j <= n:
t += n // j * 2
j *= i
m = m * t % k
for j in range(1, p[0] + 1):
if i * p[j] > n:
break
v[i * p[j]] = 1
if i % p[j] == 0:
break
print ((m + 1) * pow(2, k - 2, k) % k)
这个题参考了博客
考虑 i 存在于原集合的条件
假设 i 的倍数 s = {a * i, b * i, c * i ... } 存在于输入给定的集合中
那么我们知道 d = gcd(a, b),d * i 肯定是存在于原集合中的
那么必然存在 e = gcd(c, d),e * i 也存在于原集合中
即 gcd(a, b, c ...) * i 必然存在于原集合中
因为 i 要存在于原集合中只能依靠 s 中的元素
又有gcd(s) >= 1 * i
所以当且仅当 gcd(s) == i 的时候
才有 i 存在于原集合
枚举 i 即可
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + ; int n, m, k, b[N]; int main() {
ios::sync_with_stdio(false);
cin >> n;
for (int x, i = ; i <= n; i ++) {
cin >> x, k = max(x, k);
if (!b[x]) b[x] = , m ++;
}
for (int i = ; i <= k; i ++)
if (!b[i]) {
int t = ;
for (int j = i << ; j <= k; j += i)
if (b[j])
t = __gcd(t, j);
if (t == i) m ++;
}
cout << m;
return ;
}
傻屌题目,考虑a[x] +y
那么对b的x, 2x,3x..产生贡献
那么对c的kx,容易发现贡献次数为f(k),f(k)为k的因数个数
考虑到x是随机的,所以采用每次更新的时候O(n / x)更新
查询O(1)回答的话,期望每次更新次数是O(logn)的,成了
垃圾题目,c++ 提交的话,要开快读和快速输出...
visual c++提交的话,直接scanf + printf就成了...
#include <stdio.h> const int N = 1e6 + ; int n, m, a[N]; long long b[N]; int main() {
int op, x, y;
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i ++)
for (int j = i; j <= n; j += i)
a[j] += ;
while (m --) {
scanf("%d %d", &op, &x);
if (op == ) {
scanf("%d", &y);
for (int i = , j = x; j <= n; i ++, j += x)
b[j] += y * a[i];
}
else printf("%lld\n", b[x]);
}
return ;
}
最新文章
- jeecg单步调试
- 上传8m以上文件,报错误 101 (net::ERR_CONNECTION_RESET):连接已重置
- Asp.net MVC 之过滤器
- git同一文件由于文件名大小写不同导致不能合并
- .net4.0下 解决asp.net中&ldquo;从客户端中检测到有潜在危险的Request.Form值&rdquo;的错误
- Android Material Design简单使用
- Totime iOS购物APP
- noip 2003 传染病控制(历史遗留问题2333)
- Hbase在的应用经验的统计
- YouKu iOS笔试题一
- asp.net core中写入自定义中间件
- jatoolsprinter web打印控件直接打印不弹出
- XVI Open Cup named after E.V. Pankratiev. GP of Ekaterinburg--I.Iron man
- Java虚拟机(五)Java的四种引用级别
- JAVA设计模式初探之适配器模式
- JS事件委托应用场景
- DotNetBar滚动条的疑似BUG
- djjango cookie和session 的几种常用需求使用方法
- HDU1402(fft)
- Hadoop生态圈-Hbase的rowKey设计原则
热门文章
- 主表a主表b 从表c中有ab两个表中各一个字段a1,b1 从表d中有ab两个表中各一个字段a2,b2
- python自动化测试学习笔记-2-字典、元组、字符串方法
- 7CSS之超链接
- [转]c# 对密码执行散列和 salt 运算方法
- 背包系列 hdu 3535 分组背包
- Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
- 查看Windows XP是否已激活的方法
- Java 基础入门随笔(2) JavaSE版——关键字、进制转换、类型转换
- 行动起来:转换传统桌面应用程序到UWP 并发布到Windows 应用商店!
- 【sqli-labs】 less50 GET -Error based -Order By Clause -numeric -Stacked injection(GET型基于错误的整型Order By从句堆叠注入)