您的位置:首页 > 其它

[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)

/*
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: