A - Eddy's愛好 HDU - 2204 -莫比烏斯函式-容斥原理
阿新 • • 發佈:2018-12-22
-
A - Eddy's愛好
- HDU - 2204
- 題意:要你輸出1到n中,能夠表示成a^b的數,a,b都是大於0的整數的個數,其中b大於1。
- 思路:算一下 1-n中每個數 進行大於1的次方 不超過n 的個數。會有重複,利用莫比烏斯函式係數進行容斥即可 。
-
#include<bits/stdc++.h> using namespace std; #define ll long long ll n,ans,sum[11111]; ll mu[11111],prime[11111]; bool ok[10100]; void getphi() { memset(mu,-1,sizeof(mu)); memset(ok,0,sizeof(ok)); mu[1]=1; int id=0; for(int i=2; i<=70; i++) { if(!ok[i])prime[++id]=i; for(int j=1; j<=id&&j*prime[i]<=70; j++) { ok[i*prime[j]]=1; if(i%prime[j]==0) { mu[i*prime[j]]=0; break; } else mu[i*prime[j]]=-mu[i]; } } } int main() { getphi(); while(~scanf("%lld",&n)) { ans=1; for(int i=2; i<=70; i++) { sum[i]=powl(n,1./i); sum[i]--; } for(int i=2; i<=70; i++) { if(sum[i]<1)break; ans=ans-sum[i]*mu[i]; } printf("%lld\n",ans); } return 0; }