标签:dfs i++ 下标 不用 code def 容斥原理 fine 5*
/* 枚举素数幂p 然后求k^p<=n 的 k的个数 因为 k^p1*p2==k^p2*p1,所以这两种情况是多算的,所以要进行容斥 减去两个质数幂相乘的,再加上三个质数幂相乘的 因为2*3*5*7>60,所以最多容斥两次就可以 枚举pi最为起点进行深搜,只搜比pi大的 */ #include<bits/stdc++.h> using namespace std; #define ll long long int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}; ll ans,n; //素数下标pos,当前幂e,容斥标记(质数幂个数cnt) void dfs(int pos,ll e,int cnt){ ll k=(ll)pow(n,1.0/e); if(cnt%2)ans+=k-1;//k=1时不算 else ans-=k-1; if(cnt>2)return;//不用往下搜了 for(int i=pos+1;i<17;i++) dfs(i,e*p[i],cnt+1); } int main(){ while(cin>>n){ ans=1; for(int i=0;i<17;i++)dfs(i,p[i],1); cout<<ans<<endl; } }
标签:dfs i++ 下标 不用 code def 容斥原理 fine 5*
原文地址:https://www.cnblogs.com/zsben991126/p/10859363.html