【HDU-2204- Eddy's爱好】 容斥原理

24 篇文章 0 订阅
10 篇文章 0 订阅

HDU-2204- Eddy’s爱好
题意就是给出一个数n,问1-n中有多少个数可以表示为m^k,m,k均为正整数且k>1
由于这里k是大于1的,所以我们想一下哪些k是可以被替代的,例如一个数如果可以被表示为 m4 m 4 ,那么他一定可以被表示为 (m2)2 ( m 2 ) 2 ,所以我们知道了只要枚举所有质数次幂的组合就可以了,同样当我们枚举2的整数次幂和3的整数次幂都会枚举到6,所以我们需要容斥一下,那么容斥的个数上界是多少呢,我们发现2*3*5*7=210>60,而2^60>1e18,所以容斥的个数上界是3,容斥枚举的质数上界为59。
容斥原理第一题代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int prime[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59};
long long n,ans;
int i;//全局变量表示当前枚举的容斥是几个数的。
void dfs(int pos,int num,int p)
{
    if(p==0)
    {
        long long tmp=pow(n,1.0/num);
        if(pow(tmp,(double)num)>n) tmp--;//注意精度
        tmp--;
        if(tmp>0)
        {
            if(i&1) ans+=tmp;
            else ans-=tmp;
        }
        return ;
    }
    if(pos==17) return;
    if(num*prime[pos]<60) dfs(pos+1,num*prime[pos],p-1);
    dfs(pos+1,num,p);
    return ;
}
int main()
{
    while(scanf("%lld",&n)!=EOF)
    {
        ans=0;
        for(i=1;i<=3;i++) dfs(0,1,i);
        printf("%lld\n",ans+1);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值