码迷,mamicode.com
首页 > 其他好文 > 详细

容斥原理——hdu2204dfs深搜

时间:2019-05-13 23:31:17      阅读:200      评论:0      收藏:0      [点我收藏+]

标签: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;
    }
} 

 

容斥原理——hdu2204dfs深搜

标签:dfs   i++   下标   不用   code   def   容斥原理   fine   5*   

原文地址:https://www.cnblogs.com/zsben991126/p/10859363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!