1. 程式人生 > >luogu_2158【題解】歐拉函數

luogu_2158【題解】歐拉函數

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【題解】歐拉函數