[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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章