跳蚤 - POJ 1091 容斥原理
来源:互联网 发布:省市区三级联动数据库 编辑:程序博客网 时间:2024/05/21 06:33
跳蚤
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 8723 Accepted: 2601
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张不同的卡片。现在的问题是,在这所有的卡片中,有多少张可以完成任务。
比如当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)
(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)
题意:中文不解释。
思路:要达到它的要求,就是所有的数字的最大公约数为1。假设m的质因子有2和3,最开始有m^n种答案,减去以2为最大公约数的答案,再减去以3为最大公约数的答案,加上以6为最大公约数的答案。其中以p为最大公约数的答案共有(m/p)^n种。
AC代码如下:
#include<cstdio>#include<cstring>using namespace std;typedef long long ll;ll n,m;ll a[110],p[110],temp;void init(){ p[0]=0; ll ret=m,i; for(i=2;i*i<=ret;i++) { if(ret%i==0) { p[++p[0]]=i; while(ret%i==0) ret/=i; } } if(ret>1) p[++p[0]]=ret;}ll Pow(ll a,ll b){ ll ret=1,f=a; while(b) { if(b&1) ret*=f; f*=f; b/=2; } return ret;}void get_sum(int id,int step,int num){ int i,j,k; if(step>num) { ll ret=m; for(i=1;i<=num;i++) ret/=a[i]; temp+=Pow(ret,n); return ; } for(i=id;i<=p[0];i++) { a[step]=p[i]; get_sum(i+1,step+1,num); }}int main(){ int i,j,k; ll ans,ret; while(~scanf("%I64d%I64d",&n,&m)) { init(); ans=Pow(m,n); for(i=1;i<=p[0];i++) { temp=0; get_sum(1,1,i); if(i&1) ans-=temp; else ans+=temp; } printf("%I64d\n",ans); }}
0 0
- poj 1091 跳蚤 (数论,容斥原理)
- 跳蚤 - POJ 1091 容斥原理
- POJ 1091 跳蚤 容斥原理
- POJ 1091 跳蚤(容斥原理)
- poj 1091 跳蚤(容斥原理)
- poj 1091 跳蚤(最大公约数原理+容斥原理)
- POJ 1091 跳蚤 数论-容斥原理、扩展欧几里得
- POJ 1091 跳蚤 数论-容斥原理、扩展欧几里得
- poj 1091 跳蚤 扩展欧几里得性质+容斥原理
- poj 1091 跳蚤 扩展欧几里得+容斥原理
- POJ 1091 跳蚤 [容斥原理]【组合数学】
- POJ 1091 - 跳蚤 - 容斥原理 +扩展欧几里德+高精度
- poj 1091 跳蚤(分解质因数+容斥)
- poj 1091-跳蚤(数论+容斥)
- POJ 1091 跳蚤(数论+容斥)
- POJ 1091 跳蚤 【容斥】【质因数分解】
- PKU 1091 跳蚤 数论 容斥原理
- 容斥原理 + 大数模板(跳蚤 POJ
- C++开源日志库:log4cplus
- selenium webdriver顺利搭建
- VS2010统计代码行数
- 从CM刷机过程和原理分析Android系统结构
- centos7 设置固定IP及DNS
- 跳蚤 - POJ 1091 容斥原理
- Python利器——各种工具包汇总
- 人脸识别相关知识总结
- linux中修改mysql的默认编码
- hdu 2199 Can you solve this equation?(二分)
- 自定义控件其实很简单2
- php select form 显示查询数据
- C++中判断String是否包含某些特定字符
- C++ 内存中 常见数据存储区域