1. 程式人生 > >BZOJ2190 SDOI2008 儀仗隊 gcd,歐拉函數

BZOJ2190 SDOI2008 儀仗隊 gcd,歐拉函數

for std sdoi blog name clu bits nbsp cout

題意:求從左下角能看到的元素個數

引理:對點(x,y),連線(0,0)-(x,y),元素個數為gcd(x,y)-1(中間元素)

即要求gcd(x,y)=1

求gcd(x,y)=1的個數

轉化為2 \sum_(i=1)^(n-1) \phi(i) - 1 (思考如何轉化)

感性分析,理性計算

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,phi[100005];
 5 
 6 int main(){
 7     cin>>n;
 8     phi[1]=1;
 9     for(int i=2;i<=n;i++) phi[i]=i;
10 for(int i=2;i<=n;i++) 11 if(phi[i]==i) 12 for(int j=i;j<=n;j+=i) 13 phi[j]=phi[j]/i*(i-1); 14 long long ans=0; 15 for(int i=1;i<n;i++) ans+=phi[i]; 16 if(n==1) cout<<0; 17 else cout<<2*ans+1<<endl; 18 return 0; 19
}

BZOJ2190 SDOI2008 儀仗隊 gcd,歐拉函數