UVA11426 GCD - Extreme (II)
2017-08-10 10:15
239 查看
转载请注明出处,谢谢http://blog.csdn.net/bigtiao097?viewmode=contents
所有gcd(x,n)的值都是n的约数,可以按照这个约数分类,用g(n,i)表示满足gcd(n,x)=i且x<n的x的个数,则f(n)=∑i是n的约数i×g(n,i)
gcd(n,x)=i的充要条件是gcd(n/i,x/i)=1,因此满足条件的x/i有phi(n/i)个
对于每个n枚举约数i显然不行,我们可以采用类似素筛是用的方法,对于每个i枚举它的倍数n,问题解决。
具体代码如下:
Result:Accepted Time : 970MS
题意:
给一个n(1≤n≤4,000,000),求∑i=1i<n∑j=i+1j≤ngcd(i,j)思路:
设f(n) = gcd(1,n)+gcd(2,n)+gcd(3,n)+……+gcd(n-1,n),所求即为s(n) = f(2)+f(3)+….+f(n),关键在于求f(n).所有gcd(x,n)的值都是n的约数,可以按照这个约数分类,用g(n,i)表示满足gcd(n,x)=i且x<n的x的个数,则f(n)=∑i是n的约数i×g(n,i)
gcd(n,x)=i的充要条件是gcd(n/i,x/i)=1,因此满足条件的x/i有phi(n/i)个
对于每个n枚举约数i显然不行,我们可以采用类似素筛是用的方法,对于每个i枚举它的倍数n,问题解决。
具体代码如下:
Result:Accepted Time : 970MS
#include<bits/stdc++.h> using namespace std; const int maxn=4e6+6; typedef long long ll; ll phi[maxn]; ll f[maxn],s[maxn]; void euler_init() { phi[1]=1; for(int i=2;i<maxn;i++) phi[i]=i; //初始化 for(int i=2;i<maxn;i++) if(phi[i]==i) //判断是否为质数 若phi[i]!=i说明已经进行过运算了 for(int j=i;j<maxn;j+=i) phi[j]=phi[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 } int main() { euler_init(); for(int i=1;i<maxn;i++) for(int j=i*2;j<maxn;j+=i) f[j] += i*phi[j/i]; for(int i=2;i<maxn;i++) s[i] = s[i-1]+f[i]; int n; while(scanf("%d",&n),n) printf("%lld\n",s ); }
相关文章推荐
- UVA 11426 GCD - Extreme (II) (欧拉函数+筛法)
- UVA11426:GCD - Extreme (II) (欧拉函数)
- 白书例题 uva 11426 GCD - Extreme (II)
- uva 11426 GCD - Extreme (II) (神奇的GCD)
- uva 11426 - GCD - Extreme (II) 欧拉函数
- UVA 11426 GCD - Extreme (II) (数论|欧拉函数)
- UVA 11426 GCD - Extreme (II)
- UVA 11426 - GCD - Extreme (II)
- UVa 11426 - GCD - Extreme (II)
- UVA - 11426 GCD - Extreme (II) (欧拉函数)
- [uva 11426] GCD - Extreme (II)
- UVA 11426 - GCD Extreme(II)
- UVa 11426 GCD - Extreme (II) (欧拉函数应用·O(N*logN))
- UVA 11426 GCD - Extreme (II) (欧拉函数)
- UVA 11426 - GCD - Extreme (II) (数论)
- UVA - 11426 GCD - Extreme (II) gcd思维+巧用欧拉函数
- 欧拉 uva 11426 - GCD - Extreme (II)
- GCD - Extreme (II)(UVA11426)
- UVa11426 - GCD - Extreme (II)(欧拉函数的妙用)
- UVa 11426 - GCD - Extreme (II) 转化+筛法生成欧拉函数表