SPOJ - PGCD Primes in GCD Table - 莫比乌斯反演
来源:互联网 发布:二级指针指向二维数组 编辑:程序博客网 时间:2024/05/04 23:17
题目描述
1’.枚举prime
#include<cstdio>#include<algorithm>using namespace std;#define MAXN 10000000#define MAXP 800000int prime[MAXP+10],cntpr,mu[MAXN+10],a,b,sum[MAXN+10];bool isprime[MAXN+10];void CalMobius(int n){ mu[1]=1; for(int i=2;i<=n;i++){ if(!isprime[i]){ prime[++cntpr]=i; mu[i]=-1; } for(int j=1;prime[j]*i<=n&&j<=cntpr;j++){ isprime[prime[j]*i]=true; if(i%prime[j]==0){ mu[prime[j]*i]=0; break; } mu[prime[j]*i]=-mu[i]; } } for(int i=1;i<=n;i++) sum[i]=mu[i]+sum[i-1];}long long Cal(int n,int m){ long long ret=0; int side=min(n,m),last; for(int i=1;i<=side;i=last+1){ last=min(n/(n/i),m/(m/i)); ret+=1LL*(sum[last]-sum[i-1])*(n/i)*(m/i); } return ret;}int main(){ int T; scanf("%d",&T); CalMobius(MAXN); while(T--){ scanf("%d%d",&a,&b); int side=min(a,b); long long ans=0; for(int i=1;prime[i]<=side&&i<=cntpr;i++) ans+=Cal(a/prime[i],b/prime[i]); printf("%lld\n",ans); }}
2’.不枚举prime,进一步化简合式
(跟BZOJ(本校) 2525 公约数 - 莫比乌斯反演 这道题差不多)
见这篇blog的方法二的sum()的推导和其中链接博客的第二篇
代码来源by Liu Junhao
#include<cstdio>#include<algorithm>using namespace std;#define MAXN 10000000int sum[MAXN+10],mu[MAXN+10],p[MAXN+10],pcnt,m,n,T;long long ans;bool f[MAXN+10];void Read(int &x){ char c; while(c=getchar(),c!=EOF) if(c>='0'&&c<='9'){ x=c-'0'; while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0'; ungetc(c,stdin); return; }}void prepare(){ int i,j; for(i=2;i<=MAXN;i++){ if(!f[i]) p[++pcnt]=i,mu[i]=-1,sum[i]=1; for(j=1;p[j]*i<=MAXN;j++){ f[p[j]*i]=1; if(i%p[j]==0){ sum[i*p[j]]=mu[i]; mu[i*p[j]]=0; break; } mu[i*p[j]]=-mu[i]; sum[i*p[j]]=mu[i]-sum[i]; } sum[i]+=sum[i-1]; }}void solve(){ int i,last,t=min(m,n); ans=0; for(i=1;i<=t;i=last+1){ last=min(n/(n/i),m/(m/i)); ans+=1ll*(sum[last]-sum[i-1])*(n/i)*(m/i); }}int main(){ Read(T); prepare(); while(T--){ Read(n),Read(m); solve(); printf("%lld\n",ans); }}
0 0
- 【莫比乌斯反演】[SPOJ-PGCD]Primes in GCD Table
- SPOJ - PGCD Primes in GCD Table - 莫比乌斯反演
- 【SPOJ PGCD】Primes in GCD Table——莫比乌斯反演2
- SPOJ 4491 PGCD - Primes in GCD Table(莫比乌斯反演)
- SPOJ PGCD - Primes in GCD Table (莫比乌斯)
- SPOJ PGCD - Primes in GCD Table (好题! 莫比乌斯反演+分块求和优化)
- SPOJ PGCD - Primes in GCD Table [莫比乌斯反演+分段+求和优化]【组合数学】
- spoj Primes in GCD Table 莫比乌斯反演
- SPOJ-PGCD Primes in GCD Table (Mobius反演 好题)
- spoj 4491. Primes in GCD Table 莫比乌斯反演
- SPOJ 4491 Primes in GCD Table(莫比乌斯反演)
- SPOJ4491 Primes in GCD Table 莫比乌斯反演+分块+前缀和
- SPOJ 4491. Primes in GCD Table 【mobius反演】
- 【莫比乌斯函数】【SPOJ 4491】PGCD
- SPOJ 4491 Primes in GCD Table
- spoj 4491 莫比乌斯反演
- BZOJ 2818 Gcd + spoj 4491(莫比乌斯反演 分块)
- HDU1695 GCD(莫比乌斯反演)
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
- Java求交集和并集
- highchart图表双击dblclick事件
- 深度探索Linux内存模型
- 解决:java.lang.IllegalArgumentException: Illegal group reference
- SPOJ - PGCD Primes in GCD Table - 莫比乌斯反演
- 常用时区TimeZone转化代码
- 解决:警告:com.sun.image.codec.jpeg.JPEGImageEncoder 是 Sun 的专用 API,可能会在未来版本中删除
- 特殊项处理——计算最小距离时如何排除自身
- Jboss添加https支持
- Eclipse手动指定JDK
- USACO-Section 3.3-PROB Home on the Range
- Caused by: java.lang.ClassNotFoundException: org.apache.ws.commons.schema.utils.
- 网络传输数据如何加密