Description

Z城市居住着很多只跳蚤。在Z城市周六生活频道有一个娱乐节目。一只跳蚤将被请上一个高空钢丝的正中央。钢丝很长,可以看作是无限长。节目主持人会给该跳蚤发一张卡片。卡片上写有N+1个自然数。其中最后一个是M,而前N个数都不超过M,卡片上允许有相同的数字。跳蚤每次可以从卡片上任意选择一个自然数S,然后向左,或向右跳S个单位长度。而他最终的任务是跳到距离他左边一个单位长度的地方,并捡起位于那里的礼物。
比如当N=2,M=18时,持有卡片(10, 15, 18)的跳蚤,就可以完成任务:他可以先向左跳10个单位长度,然后再连向左跳3次,每次15个单位长度,最后再向右连跳3次,每次18个单位长度。而持有卡片(12, 15, 18)的跳蚤,则怎么也不可能跳到距他左边一个单位长度的地方。
当确定N和M后,显然一共有M^N张不同的卡片。现在的问题是,在这所有的卡片中,有多少张可以完成任务。

Input

两个整数N和M(N <= 15 , M <= 100000000)。

Output

可以完成任务的卡片数。

Sample Input

2 4

Sample Output

12

Hint

这12张卡片分别是:
(1, 1, 4), (1, 2, 4), (1, 3, 4), (1, 4, 4), (2, 1, 4), (2, 3, 4),
(3, 1, 4), (3, 2, 4), (3, 3, 4), (3, 4, 4), (4, 1, 4), (4, 3, 4)

分析
考点:数论和组合数学的相关知识
如果存在x[1],x[2]…x[n],使得 data[1]*x[1]+data[2]*x[2]+…+data[3]*x[3]==1;,则,data[1],data[2],…data[n]最大公约数一定是1;

下面我们用反证法来证明一下

反证法
如果存在最大公约数 d ,则data[1]*x[1]+data[2]*x[2]+…+data[3]*x[3]一定能被d 整除,所以这显然d不等于1,所以如果想让data[1]*x[1]+data[2]*x[2]+…+data[3]*x[3]==1;,data[1],data[2],…data[n]最大公约数一定是1;

一共有 m^n张卡片,如果减去其中含有公约数的卡片剩下的就是所求的结果

举个例子 n=2, m=360; 360=2 ^ 3 * 3 ^ 2 * 5

总方案数 = (m ^ n) - (有公因数2的n元组)- (有公因数3的n元组)- (有公因数5的n元组)+ (有公因数2,3的n元组) +(有公因数2,5的n元组) + (有公因数3,5的n元组)- (有公因数2,3,5的n元组)

这个比公式形象些有公因数d的n元组,每个位置上有 (m/d)个选择(1 ~ m里面有m/d个d的倍数),根据乘法原理,可以得出有公因数d的n元组有 (m/d)^n 个。

根据数论的知识,n个数的最大公约数规定为这n个数线性和的最小自然数,所以此题就是要求最大公约数为1的数列的个数

我们假设卡片上的数分别为:a1,a2,a3,a4⋅⋅⋅⋅⋅⋅an,m,那么如果要满足题目要求,就是说存在一个数列x:x1,x2,x3,x4⋅⋅⋅⋅⋅⋅xn,xn+1使得a1x1+a2x2+a3x3+a4x4+⋅⋅⋅⋅⋅⋅+anxn+mxn+1=1。也就是说gcd(a1,a2,a3,a4,⋅⋅⋅⋅⋅⋅,an,m)=1

(欧几里得)

综上所述,我们先将m质因数分解,然后容斥统计即可。

AC

#include<iostream>
#include<cmath>
using namespace std;
const int maxn=100+8;
typedef long long LL;
int num;
int prime[maxn];
LL p[maxn];
LL res,temp;
int n,m;
void divide(int m)
{num=0;for(int i=2;i*i<=m;i++){if(m%i==0){prime[++num]=i;m/=i;while(m%i==0) m/=i;}}if(m>1) prime[++num]=m;
}
void dfs(int b,int cnt,int c)
{if(cnt==c){int x=m;for(int i=1;i<=c;i++)x/=p[i];temp+=pow(x,n);return;}for(int i=b;i<=num;i++){p[cnt+1]=prime[i];dfs(i+1,cnt+1,c);}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);while(cin>>n>>m){res=0;divide(m);for(int i=1;i<=num;i++){temp=0;dfs(1,0,i);if(i&1) res+=temp;else res-=temp;}res=pow(m,n)-res;cout<<res<<endl;}return 0;
}

学如逆水行舟,不进则退

POJ 1091 跳蚤 【容斥原理】+模板相关推荐

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

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

  2. POJ 1091 跳蚤

    跳蚤 Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: 1091 64 ...

  3. POJ 1287 Prim算法模板

    原题链接:POJ1287 解析:这题我用来练习Prim算法的,算是当作一个模板来看.以下代码有几点要说明的: 我使用了优先队列,并没有使用dist[u]数组来保存当前子树到 u 的最短距离,这样省去了 ...

  4. Drainage Ditches - poj 1273(网络流模板)

    题意:1是源点,m是汇点,求出来最大流量,没什么好说的就是练习最大流的模板题 ************************************************************* ...

  5. POJ 1091(数论)

    题目大意是给定两个整数n和m,求出长度为n+1满足条件的数列data的个数,数列的要求下: 1)1<=data[i]<=m,for1<=i<=n 2)data[n+1]=m; ...

  6. jzyzoj 1216 poj虫洞 3259 Bellman_Ford模板

    描述 Description 在一个神秘岛上,有N(1 <= N <= 500)个洞口,标号1-N,它们之间有M (1 <= M <= 2500) 条通道相连.神秘的竟然另外还 ...

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

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

  8. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  9. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

最新文章

  1. php代码生成txt文件并下载
  2. pyspark groupBy代码示例
  3. C++11新特性学习
  4. 深入理解计算机操作系统:链接
  5. HALCON示例程序distance_transform.hdev通过distance_transform检测线的缺陷
  6. Yarn 国内加速,修改镜像源
  7. log4net简单配置与应用
  8. pdf照片显示正常打印时被翻转_明天开始打印准考证,你需要注意这些!
  9. 2.证券投资基金的概述
  10. QQ互赞助手pro【每天免费互shua名片赞】2.0系统版本
  11. 微软 2021 校园招聘正式启动!
  12. 免费的Office办公套件LibreOffice for Mac
  13. 【已恢复】苹果再堵开发者账号注册漏洞,黑市账号价格有价无市!
  14. mysql 将数据导出成excel文件(.xls格式)
  15. 账号升级攻略:每天自动升级b站和网易云音乐,自动签到天翼云盘和百度贴吧...
  16. (建议精读)HTTP灵魂之问,巩固你的 HTTP 知识体系
  17. java程序设计教程第三版雍俊海
  18. 关于进程杀不掉的问题:Waiting for process with pid xxxxx to finish
  19. 认证、认可、检验检测分不清?这篇必看
  20. linux 查看文件大小的命令

热门文章

  1. talend同步mysql_Talend可以为MySQL输出使用动态表名吗?
  2. 程序猿媛都偷偷深爱的九大习惯
  3. 6 FPGA时序约束理论篇之xdc约束优先级
  4. python课程多少钱-天津Python培训班学费多少
  5. riscv代码调试遇到过的问题及坑
  6. 中亦图灵 | 作为赞助商加盟 2022 Zabbix中国峰会
  7. 【imarkdown】一个轻量级markdown图片链接转换器
  8. LP3THW 练习、学习训练、个人小结 Exercise_1
  9. org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session
  10. 美国国内最大的招聘网站(转)