BZOJ2190 SDOI2008 儀仗隊 gcd,歐拉函數
阿新 • • 發佈:2018-02-10
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,歐拉函數