【51nod 1190】最小公倍数之和 V2
来源:互联网 发布:数据侠客行txt精校版 编辑:程序博客网 时间:2024/06/10 19:59
Description
给出2个数a, b,求LCM(a,b) + LCM(a+1,b) + .. + LCM(b,b)。
例如:a = 1, b = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66。
由于结果可能很大,输出Mod 10^9 + 7的结果。(测试数据为随机数据,没有构造特别坑人的Test)
Solution
令T=d*d’
由于
并且由
我们可以对b分解质因数,枚举b的约数T,同时就能算出
Code
#include<iostream>#include<math.h>#include<string.h>#include<stdio.h>#include<algorithm>#define ll long longusing namespace std;const ll maxn=1e5,mo=1e9+7,mo2=5e8+4;int d[maxn],bz[maxn+5],b1[maxn],c[maxn];ll n,i,t,j,k,l,a,b,z,ans,p;void dg(int x,int y,ll z){ ll t=1,k; if (y>b1[0]){ t=(a%x)?a/x+1:a/x; k=b/x; ans+=(t+k)*(k-t+1)*z; return; } dg(x,y+1,z); for (k=1;k<=c[y];k++) t*=b1[y],dg(x*t,y+1,z*(1-b1[y]));}int main(){ scanf("%lld",&n); for (i=2;i<=maxn;i++){ if (!bz[i]) d[++d[0]]=i; for (j=1;j<=d[0];j++){ if (i*d[j]>maxn) break; bz[i*d[j]]=1; if (i%d[j]==0) break; } } for (i=1;i<=n;i++){ scanf("%lld%lld",&a,&b); z=b;b1[0]=0; for (j=1;d[j]*d[j]<=z;j++){ if (z%d[j]) continue; b1[++b1[0]]=d[j];c[b1[0]]=0; while (z%d[j]==0) z/=d[j],c[b1[0]]++; } if (z>1)b1[++b1[0]]=z,c[b1[0]]=1; ans=0; dg(1,1,1);ans=(ans%mo+mo)%mo*mo2%mo; ans=b%mo*ans%mo; printf("%lld\n",ans); }}
1 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
- 关于hibernater找不到表
- Laravel5.4初试-php artisan migrate问题
- faster rcnn在ubuntu环境下使用GPU模式并用cuDNN v5加速
- Python pandas快速入门
- 前台开发总结03
- 【51nod 1190】最小公倍数之和 V2
- Java List 用法代码分析
- 机器学习笔记十四:随机森林
- elasticsearch this is not a http port
- FMDB进行封装模型(模型的属性只支持字符串和NSData)
- react实现登录页面demo
- Leetcode53——Maximum Subarray
- Mat详解
- 了解响应式布局