51nod 1190 最小公倍数之和V2
来源:互联网 发布:天猫和淘宝是什么关系 编辑:程序博客网 时间:2024/05/19 18:18
题目大意:
给出2个数a, b,求LCM(a,b) + LCM(a+1,b) + .. + LCM(b,b)。
1<=a<=b<=10^9
T组数据,1<=T<=50000
且数据为随机,没有构造的卡人数据。
题解:
这一题我是不会的,去网上看了下题解,发现了一个奇怪的反演姿势。
必要结论:
证明略。
设T = d * d’
我们观察一下
狄利克雷卷积做了这么多,轻松可得:
若
在递归枚举约数的时候维护一下即可。
Code:
#include<stdio.h>#define ll long long#define fo(i, x, y) for(int i = x; i <= y; i ++)using namespace std;const ll mo = 1e9 + 7, ni_2 = 5e8 + 4;const int Maxn = 32000;bool bz[Maxn + 1];int T, a, b, z, i, u[35], v[35], p[3500];ll ans;void dg(int x, int d, ll s) { if(x > u[0]) { ll t1 = b / d, t2 = (a + d - 1) / d ; ans += (t1 + t2) * (t1 - t2 + 1) * s; return; } dg(x + 1, d, s); s = s * (1 - u[x]); fo(i, 1, v[x]) d *= u[x], dg(x + 1, d, s);}int main() { for(i = 2; i <= Maxn; i ++) { if(!bz[i]) p[++ p[0]] = i; fo(j, 1, p[0]) { int k = i * p[j]; if(k > Maxn) break; bz[k] = 1; if(i % p[j] == 0) break; } } for(scanf("%d", &T); T; T --) { scanf("%d %d", &a, &b); z = b; u[0] = 0; for(i = 1; p[i] * p[i] <= z; i ++) { if(z % p[i]) continue; u[++ u[0]] = p[i]; v[u[0]] = 0; while(z % p[i] == 0) v[u[0]] ++, z /= p[i]; } if(z > 1) u[++ u[0]] = z, v[u[0]] = 1; ans = 0; dg(1, 1, 1); printf("%lld\n", (ans % mo + mo) % mo * ni_2 % mo * b % mo); }}
阅读全文
0 0
- 【51nod 1190】最小公倍数之和 V2
- 51nod 1190 最小公倍数之和V2
- 最小公倍数之和 V2 51Nod
- 51nod 1190 最小公倍数之和 V2(莫比乌斯反演)
- [莫比乌斯反演 积性函数前缀和] 51Nod 1190 最小公倍数之和 V2
- 51nod 1190 最小公倍数之和 V2(莫比乌斯反演)
- [51nod1190]最小公倍数之和V2
- 51 nod 1363 最小公倍数之和
- 【51Nod 1363】最小公倍数之和
- 51nod 1363 最小公倍数之和
- 51Nod-1363-最小公倍数之和
- [杜教筛] 51Nod 1238 最小公倍数之和 V3
- 【51NOD 1238】最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51Nod-1238-最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51nod 1108 距离之和最小 V2
- 外贸网站的进阶过程
- pwnabe之cmd1
- JAVA学习划重点第一部分
- 基本数据类型
- strstr函数
- 51nod 1190 最小公倍数之和V2
- cf 304A Pythagorean Theorem II
- Swift 路由机制设计
- 我眼中的ASP.NET Core之微服务
- Python 实现 Discuz论坛附件下载权限绕过漏洞
- ReactiveCocoa源码解析(四) Signal中的静态属性静态方法以及面向协议扩展
- HDU-2669 拓展欧几里得
- 公司员工考勤系统Java代码
- Caffe3——ImageNet数据集创建lmdb类型的数据