[BZOJ 2190][SDOI2008]仪仗队:欧拉函数
2017-05-31 11:09
363 查看
点击这里查看原题
显然,对于每个(x,y)(x,y均不为1),(x,y)能被看到的条件是gcd(x-1,y-1)=1,因此我们需要求gcd(x-1,y-1)=1的对数,由于第一排、第一列分别有一个可以看到的,因此答案还需要加2。
对每一排,x<=y中,满足条件的x的个数等于phi(y);对每一列同理(但是(2,2)被算了两次),因此答案=2*sigma(phi(i))-1+2(1<=i<=n)
显然,对于每个(x,y)(x,y均不为1),(x,y)能被看到的条件是gcd(x-1,y-1)=1,因此我们需要求gcd(x-1,y-1)=1的对数,由于第一排、第一列分别有一个可以看到的,因此答案还需要加2。
对每一排,x<=y中,满足条件的x的个数等于phi(y);对每一列同理(但是(2,2)被算了两次),因此答案=2*sigma(phi(i))-1+2(1<=i<=n)
/* User:Small Language:C++ Problem No.:2705 */ #include<bits/stdc++.h> #define ll long long #define inf 999999999 using namespace std; const int M=4e5+5; int phi[M],prime[M],cnt,n,ans; bool not_prime[M]; int main(){ freopen("data.in","r",stdin);// scanf("%d",&n); phi[1]=1; for(int i=2;i<=n;i++){ if(!not_prime[i]){ prime[++cnt]=i; phi[i]=i-1; } for(int j=1;j<=cnt&&prime[j]*i<=n;j++){ not_prime[i*prime[j]]=1; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } for(int i=1;i<n;i++) ans+=phi[i]; printf("%d\n",2*ans+1); return 0; }
相关文章推荐
- 【BZOJ】2190: [SDOI2008]仪仗队(欧拉函数)
- [BZOJ2190] [SDOI2008] 仪仗队 - 欧拉函数
- [bzoj 2190] [SDOI2008]仪仗队:欧拉函数,线性筛
- BZoj 2190: [SDOI2008]仪仗队【欧拉函数】
- bzoj 2190: [SDOI2008]仪仗队 -- 欧拉函数
- bzoj 2190: [SDOI2008]仪仗队 线性欧拉函数
- Bzoj2190:[SDOI2008]仪仗队:欧拉函数
- bzoj 2190: [SDOI2008]仪仗队 欧拉函数
- 【bzoj2190】[SDOI2008]仪仗队 欧拉函数
- BZOJ2190 [SDOI2008]仪仗队(欧拉函数)
- BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )
- 【bzoj2190】【sdoi2008】【仪仗队】【欧拉函数】
- ♥BZOJ 2190: [SDOI2008]仪仗队【欧拉函数】
- 【bzoj2190】[SDOI2008]仪仗队 线性筛欧拉函数
- bzoj2190 [SDOI2008]仪仗队(欧拉函数)
- [BZOJ2190][SDOI2008]仪仗队(欧拉函数|莫比乌斯反演)
- [BZOJ 2190] SDOI 2008 仪仗队 · 欧拉函数
- bzoj 2190 [SDOI2008]仪仗队(欧拉函数)
- bzoj2190: [SDOI2008]仪仗队(欧拉函数)
- BZOJ 2190 [SDOI2008]仪仗队——欧拉函数