[BZOJ 2190][SDOI2008]仪仗队:欧拉函数

点击这里查看原题

显然,对于每个(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;
}

猜你喜欢

转载自blog.csdn.net/SmallSXJ/article/details/72818697