hdu2204 Eddy's 爱好 【容斥原理】

题目链接: hdu2204

题意:
给一正整数n (1<=n<=1018) , 求[1,n]中能表示成 MK(K>1) 的数的个数。

第一次好好看容斥,感觉智商已经不够了,看了好多题解才明白。。。

  1. MK<=n 满足, 则任意m <= M 都满足 mK<=n
  2. 满足 MK 的数中,若K不是素数,则 MK=(Ma)p , 其中a*p = K且p是素数, 即满足题意的数都可以表示成 xp ,p是素数,答案仅需找出满足 xp 的个数;
  3. xp 中有许多重复的,若 x=yq (q是素数且 pq ), (xp)q=(xq)p , 例如 (62)3=(63)2
    规律满足容斥原理, ans=f(p1)+...f(p1p2)...+... ;
  4. 因为 260>1018 , 2*3*5*7 > 60, 所以所需最大素数为59,最高组合数不会过3个;
  5. 注意精度问题,虽说数据很水,不写也会过。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;


typedef long long LL;

const double eps = 1e-9;

int p[17] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59};
LL n, ans;

void dfs(int cur, int ex, int pos)
{
    if(pos > 3)
        return;
    for(int i = cur; i < 17; i++)
    {
        LL num = pow(n, 1.0/(p[i]*ex)) + eps;
        num--;
        if(num > 0)
            pos&1? ans += num: ans -= num;
        dfs(i+1, ex*p[i], pos+1);
    }
}
int main(int argc, char const *argv[])
{
    while(~scanf("%lld", &n))
    {
        ans = 0;
        dfs(0, 1, 1);
        printf("%lld\n", ans+1);
    }
    return 0;
}
一、资源详解 实验报告:通过实际操作与数据记录,让您深入理解计算机内部的工作原理。每份实验报告都详细记录了实验步骤、结果及分析,助您巩固知识点。 学习笔记:由资深学者精心整理的学习笔记,重点突出,为您梳理课程脉络,把握核心内容。 复习资料与试卷:涵盖了各类复习资料和历年试卷,助您备战考试,查漏补缺,提高应试能力。 作业答案:提供完整的作业答案及解析,让您在完成课后作业时更有信心,确保理解每一个知识点。 一二、计算机组成原理:从基础到进阶,全面突破的必备资源 在信息爆炸的时代,计算机组成原理作为计算机科学的核心课程,显得尤为重要。为了帮助广大学子更好地掌握这一关键领域,我们特地整理了这一系列与计算机组成原理相关的资源,助力您的学术旅程。 三、适用场景广泛 无论是期末考试冲刺、计算机组成原理实验报告作业、还是复习题、试题、考研资料等需求,这些资源都能满足您的要求。全面覆盖理论要点与实践操作,让您在学习和备考过程中游刃有余。 四、使用建议 系统学习:建议按照章节顺序进行系统学习,结合实验报告进行实践操作,以加深理解。 备考策略:利用复习资料与试卷资源,制定有效的备考计划,提高考试通过率。 持续反馈与改进:根据作业答案进行自我评估,找出薄弱环节,及时调整学习策略。 五、版权与安全提示 尊重知识产权:在使用这些资源时,请尊重原作者的权益,遵守版权法规。 安全使用:确保在使用过程中不侵犯他人权益,避免任何形式的学术不端行为。 感谢您选择我们的计算机组成原理资源库!让我们一起深入探索计算机的奥秘,用知识武装自己,开启精彩的学术之旅!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值