luogu_2158【題解】歐拉函數
阿新 • • 發佈:2019-05-15
class span space lld col urn 根據 函數 inline
題目:https://www.luogu.org/problemnew/show/P2158
根據題目看出,除了 (1,0) (0,1) (1,1) 以外,所以可以看見的釘子 (x , y) x和y是互質的。
所以!明明顯現就是歐拉函數。
歐拉函數表示1到N中與N互質的數的個數。
可以只跑一半,乘2。
然後加上3。
所以關鍵找出2到N的每個數的歐拉函數。
代碼如下。
#include<bits/stdc++.h> using namespace std; const int maxn=40001; int n; int phi[maxn]; inline void euler(){for(int i=2;i<=n;i++) phi[i]=i; for(int i=2;i<=n;i++) if(phi[i]==i) for(int j=i;j<=n;j+=i) phi[j]=phi[j]/i*(i-1); } int main() { scanf("%d",&n); euler(); if(n==1) {cout<<0<<endl;return 0;} long long ans=3;for(int i=2;i<n;i++) ans+=2*phi[i]; printf("%lld\n",ans); return 0; }
luogu_2158【題解】歐拉函數