题目大意:中文题就不翻译了

思路:假设跳蚤选择X1个第一张卡片,X2个第二张卡片。。。Xn个第n张卡片,Xn+1张写着m的卡片,那么就可以列出方程:a1*X1+a2*X2+…+an*Xn+m*X(n+1)=1

由于可以向左跳和向右跳,因此题目即问上述不定方程是否有解?答案以及它的证明可以在任何一本数论书中找到,它的充要条件是(a1,a2,a3。。。an,m)|1 即a1,a2,a3。。。an,m互质,这样题目就成为:有n+1个正整数,其中最大的数为m,问所有符合条件的序列中有多少是互质的。

组合数学很多都是正难则反易的,考虑问题的背面有多少最大公约数不为1的?先把m分解质因数,m的每一个因子可以看成一个集合,集合中的元素为最大公约数为这个因子的序列,这个问题的答案便是所有集合的并中集合的元素,用容斥就显然了

最后将总数m^n减去最大公约数不为1的个数,结果就是互质的个数了

顺便吐槽下,虽然容斥属于集合论里面的东西,但经常用来证明数论题目,最早学它好像就是用来推导欧拉函数的公式时用的

#include <cstdio>

#include <string>

#include <iostream>

#include <math.h>

#define ll __int64

using namespace std;

llfactor[100000],h=0,stack[100000],top=0,mt,nt,ret1;

ll quickpow(ll n,ll m)

{

ll ret=1;

while (m)

{

if ((m & 1))ret*=n;

n*=n;

m>>=1;

}

return ret;

}

void dfs(ll step,ll now,ll layer,ll num)

{

if (step==layer){ret1+=quickpow(mt/num,nt);return ;}

for(inti=now+1;i<=h-layer+step+1;i++)dfs(step+1,now+1,layer,num*factor[i]);

}

int main()

{

ll n;

scanf("%I64d%I64d",&nt,&mt);

n=mt;

while ((n & 1)==0){h=1;factor[h]=2;n>>=1;}

ll q=sqrt(n);

for(ll i=3;i<=q && n!=1;i+=2)

{

if (n % i==0)factor[++h]=i;

while(n%i==0)n=n/i;

}

if (n!=1)factor[++h]=n;

ll ans=0,flag=-1;

for(ll i=1;i<=h;i++)

{

flag*=-1;

top=ret1=0;

dfs(0,0,i,1);

ans+=ret1*flag;

}

printf("%I64d\n",(ll)quickpow(mt,nt)-ans);

return 0;

}

转载于:https://www.cnblogs.com/philippica/p/4007004.html

poj1091:跳蚤【容斥原理】相关推荐

  1. Poj--1091 跳蚤(容斥定理)

    跳蚤 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一 ...

  2. poj1091跳蚤(容斥定理)

    题目: Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后 ...

  3. POJ - 1091 跳蚤(容斥原理+数论)

    题目链接:点击查看 题目大意:中文题意,不多赘述 题目分析:根据题目的意思,其实只需要让所有数的最大公约数为1就可以满足条件,好像是用到了欧几里得的一些知识,奈何我的数论比较菜,也不会证明,就直接用网 ...

  4. poj1091 跳蚤

    文章目录 题目链接: 题目链接: http://poj.org/problem?id=1091 貌似真的要用高精度,这数据范围真的有问题,随便想个数据都能装不下,long long 能过应该是数据有点 ...

  5. POj-1091 跳蚤

    原题链接:http://poj.org/problem?id=1091 题目大意:给你两个数n和m:总共有m^n张卡片,每张卡片上有n+1个数字,然后根据卡片上的数字可以向左跳也可以向右跳,每个数字跳 ...

  6. 信息学竞赛中的数学知识 --- 容斥原理

    C++基础数论-----容斥原理 C++基础数论-----容斥原理_C2020lax的博客-CSDN博客_容斥原理c++ C++数论容斥原理----无关的元素 C++数论容斥原理----无关的元素 - ...

  7. 组合数学 —— 容斥定理

    [概述] 容斥原理是一种较常用的计数方法,其基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复. 容斥原理 ...

  8. 跳蚤(POJ-1091)

    Problem Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡 ...

  9. 洛谷P2231 [HNOI2002]跳蚤 [数论,容斥原理]

    题目传送门 跳蚤 题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+ ...

最新文章

  1. zTree实现节点修改的实时刷新
  2. web服务的搭建 windows server 2008
  3. 自制CSDN博客评论邮件提醒
  4. 【算法】BitMap
  5. Ajax判断用户名是否可用
  6. C++输入与输出—cout和cin的用法
  7. docker php kafka,docker安装kafka
  8. 仅20行代码,实现文件自动化上传。
  9. 测试面经|从测试螺丝钉到大厂测试开发,三点成长心得和面试经验
  10. 三星固态优化软件.samsung magician 中文下载地址
  11. 关于平面束方程的理解
  12. 99kk1.com login.php,自己写的qq登录功能,无需官方SDK
  13. pzh-web前端学习汇总-大二
  14. 物联网行业解决方案之智慧畜牧
  15. H5版仿制微信跳一跳小游戏,网页版仿微信跳一跳小游戏源码,实现了跳一跳的基本核心功能
  16. MinIO文件服务器,从安装到使用
  17. 你需要掌握的 Koa 洋葱模型和中间件
  18. 【云原生】Prometheus PromQL讲解与实战操作
  19. 明星直播的品牌效应,这几个关键数据你一定要知道!
  20. JavaScript滚轮事件

热门文章

  1. shell备份mysql思路_写一个shell脚本备份mysql数据库的步骤
  2. 阿里云宣布与国内规模最大的汽车企业上汽集团合作
  3. Swift教程之基本操作符
  4. (1/2)Canvas的交互存为图片-基本篇
  5. pt-query-digest查询日志分析工具
  6. VC中用到的几种调试输出TRACE的方法及其区别
  7. [转贴]人老总是一场空
  8. LeetCode 5367. 最长快乐前缀
  9. C语言程序项目计划书,(C语言程序设计课程设计计划书.doc
  10. Fiddler跨域调试及Django跨域处理