容斥原理——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深搜的主要内容,如果未能解决你的问题,请参考以下文章

hdu2204 Eddy's爱好 打表+容斥原理

HDU5468(dfs序+容斥原理)

hdu 5468(dfs序+容斥原理)

HDU 2461 Rectangles#容斥原理

HDU 1796 How many integers can you find(容斥原理+二进制/DFS)

HDU-1016 Prime Ring Problem(DFS深搜+打表)