51nod 1190 最小公倍数之和 V2(莫比乌斯反演)
来源:互联网 发布:iphone视频录制软件 编辑:程序博客网 时间:2024/06/10 19:29
题意:
分析:
最后一步转化是另
做到最后发现需要枚举
易知:
所以枚举约数
算一下复杂度:
所以总的最大复杂度为
下面是代码:
#include <bits/stdc++.h>#define LL long long#define FOR(i,x,y) for(int i = x;i < y;++ i)#define IFOR(i,x,y) for(int i = x;i > y;-- i)using namespace std;const LL Mod = 1000000007;const int maxn = 100010;const LL inv = 500000004;LL a,b;int prime[maxn];bool check[maxn];int pri[35],pri_cnt,len[35];vector <int> fac;void Mobius(){ memset(check,false,sizeof(check)); prime[0] = 0; FOR(i,2,maxn){ if(!check[i]){ prime[++prime[0]] = i; } FOR(j,1,prime[0]+1){ if(i*prime[j] >= maxn) break; check[i*prime[j]] = true; if(i%prime[j] == 0) break; } }}void dfs(int res,int l){ if(l >= pri_cnt) {fac.push_back(res);return;} int tem = 1; dfs(res,l+1); FOR(i,1,len[l]+1){ tem *= pri[l]; dfs(res*tem,l+1); }}void Get_Fac(){ pri_cnt = 0; int b_c = b; FOR(i,1,prime[0]+1){ if(prime[i]*prime[i] > b_c) break; if(b_c % prime[i] == 0) {pri[pri_cnt++] = prime[i]; len[pri_cnt-1] = 0;} while(b_c % prime[i] == 0) {b_c /= prime[i];len[pri_cnt-1] ++;} } if(b_c > 1) {pri[pri_cnt++] = b_c; len[pri_cnt-1] = 1;} fac.clear(); dfs(1,0);}void work(){ Get_Fac(); LL ans = 0; FOR(i,0,(int)fac.size()){ int v = fac[i]; LL tt = a+v-1; LL tem = (((tt/v+b/v)%Mod)*((b/v-tt/v+1+Mod)%Mod)%Mod)*inv%Mod; LL res = 1; FOR(j,0,pri_cnt){ if(v % pri[j]) continue; LL t = (1-pri[j]+Mod)%Mod; res = (res*t)%Mod; } ans += (res*tem)%Mod; ans %= Mod; } ans = (ans*b)%Mod; printf("%lld\n",ans);}int main(){ //freopen("test.in","r",stdin); //freopen("out.txt","w",stdout); Mobius(); int T; scanf("%d",&T); while(T--){ scanf("%lld%lld",&a,&b); work(); } return 0;}
0 0
- 51nod 1190 最小公倍数之和 V2(莫比乌斯反演)
- 51nod 1190 最小公倍数之和 V2(莫比乌斯反演)
- [莫比乌斯反演 积性函数前缀和] 51Nod 1190 最小公倍数之和 V2
- [数论][莫比乌斯反演][杜教筛] 51Nod 1238 最小公倍数之和 V3
- 51nod 1355 斐波那契的最小公倍数 (数论+莫比乌斯反演)
- 【51nod 1190】最小公倍数之和 V2
- 51nod 1190 最小公倍数之和V2
- 最小公倍数之和 V2 51Nod
- [杜教筛+莫比乌斯反演] 51Nod1238: 最小公倍数之和 V3
- [莫比乌斯反演 复杂度分析] 51Nod 1222 最小公倍数计数
- [莫比乌斯反演] 51Nod 1355 斐波那契的最小公倍数
- 51nod 1222 最小公倍数计数 莫比乌斯反演+杜教筛
- [数论][莫比乌斯反演] 51Nod 1222 最小公倍数计数
- 51nod 1355 斐波那契的最小公倍数 莫比乌斯反演+数学
- [数论][莫比乌斯反演][杜教筛] 51Nod 1220 约数之和
- 51Nod1222:最小公倍数计数 (莫比乌斯反演)
- 【51nod1222】【最小公倍数计数】【莫比乌斯反演】
- 51nod 1675 序列变换 莫比乌斯反演
- javascript常用的事件
- 理解threadlocal
- SpringMVC+Shiro权限管理
- 2015App开发思维进阶(iOS、Android)
- No resource found that matches the given name after upgrading to AppCompat v23
- 51nod 1190 最小公倍数之和 V2(莫比乌斯反演)
- Android LayoutInflater原理分析(一)
- 从头认识java-6.1 聚合(aggregation)
- 安卓开发常用网站
- 基础总结篇之二:Activity的四种启动模式launchMode
- iOS 高清截取控件原图
- 详解C/C++预处理器
- hdu 3333 Turing Tree(线段树求区间内不同值之和+离线处理)
- Java读取properties文件的思考(static块中读取)