容斥原理——hdu2204dfs深搜
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容斥原理——hdu2204dfs深搜相关的知识,希望对你有一定的参考价值。
/* 枚举素数幂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; } }
以上是关于容斥原理——hdu2204dfs深搜的主要内容,如果未能解决你的问题,请参考以下文章