【poj1091】 跳蚤
http://poj.org/problem?id=1091 (题目链接)
题意
给出一张卡片,上面有n+1个数,其中最大的数为m,每次可以向前或者向后走卡片上面的步数。问有多少种方案选出n个数组成一张卡片,使得存在一种走的方案经过若干步后可以达到与起点距离为1的位置上。
Solution
今天考试题,又是一道大原题。。。
我们假设卡片上的数分别为:${a_1,a_2,a_3,a_4······a_n,m}$,那么如果要满足题目要求,就是说存在一个数列${x:x_1,x_2,x_3,x_4······x_n,x_{n+1}}$使得${a_1x_1+a_2x_2+a_3x_3+a_4x_4+······+a_nx_n+mx_{n+1}=1}$。也就是说${gcd(a_1,a_2,a_3,a_4,······,a_n,m)=1}$(欧几里得)。
所以我们知道了合法的卡片上面的数的gcd一定为1,但是这样的话并不是特别好处理,我们考虑求出不合法的卡片方案数,再用总的卡片方案数减去不合法的得到答案。
不合法的方案就是卡片上的数字的gcd不为1,于是我们可以枚举它的gcd。对于1个gcd:x,它的方案数为:${(\frac{m}{x})^n}$。这个式子的意思就是在小于等于${m}$的数中有${\frac{m}{x}}$个能被${x}$整除的数,于是卡片上的每一个位置就有${\frac{m}{x}}$个数可以供你选择。这就转化为了容斥原理的经典问题:求小于等于m的数中,能够整除m的数的个数。我们只是将统计答案那一步稍加修改一下罢了。注意,如果统计过gcd为x的情况,那么不用再统计gcd为x2的情况了,因为gcd为x不会统计两次。
综上所述,我们先将m质因数分解,然后容斥统计即可。
细节
其实这道题还有个隐藏数据范围:mn≤1016,是不是很高兴,不用写高精度了。
代码
// poj1091
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; LL n,m,ans,p[1000];
int num; void divide(LL m) {
num=0;
for (int i=2;i*i<=m;i++) if (m%i==0) {
p[++num]=i;m/=i;
while (m%i==0) m/=i;
}
if (m>1) p[++num]=m;
}
LL power(LL a,LL b) {
LL res=1;
while (b) {
if (b&1) res*=a;
a*=a;
b>>=1;
}
return res;
}
void dfs(int x,int y,int z) {
if (z>m) return;
if (x==num+1) {
if (y) {
if (y&1) ans-=power(m/z,n);
else ans+=power(m/z,n);
}
return;
}
dfs(x+1,y,z);
dfs(x+1,y+1,z*p[x]);
}
int main() {
scanf("%lld%lld",&n,&m);
ans=power(m,n);
divide(m);
dfs(1,0,1);
printf("%lld",ans);
return 0;
}
【poj1091】 跳蚤的更多相关文章
- POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)
题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...
- 【容斥原理】【分解质因数】poj1091 跳蚤
题意转化为求一个线性组合a1*x1+a2*x2+...+an*xn+m*xn+1=1在什么时候可以有解.(ai在1~m的范围内任取) 易得当且仅当gcd(a1,a2,...,an)=1时可能有解. 然 ...
- Gcd&Exgcd算法学习小记
Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...
- [BZOJ1220][POJ1091][HNOI2002]跳蚤
[BZOJ1220][POJ1091][HNOI2002]跳蚤 试题描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长. ...
- 刷题总结——跳蚤(poj1091容斥+分解质因数)
题目: Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有 ...
- poj1091:跳蚤【容斥原理】
题目大意:中文题就不翻译了 思路:假设跳蚤选择X1个第一张卡片,X2个第二张卡片...Xn个第n张卡片,Xn+1张写着m的卡片,那么就可以列出方程:a1*X1+a2*X2+…+an*Xn+m*X(n+ ...
- 北大poj-1091
跳蚤 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9591 Accepted: 2892 Description Z ...
- 小JAVA大世界之程序建模跳蚤实验
package com.chigoe;//房子类class House { private int m;// 保存行数 private int n;// 保存列数 private int[][] a; ...
- 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
4310: 跳蚤 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 180 Solved: 83[Submit][Status][Discuss] De ...
随机推荐
- js profiler
https://developers.google.com/web/fundamentals/performance/critical-rendering-path/?hl=en https://de ...
- getSelection、range 对象属性,方法理解,解释
网上转了一圈发现没有selection方面的解释,自己捣鼓下 以这段文字为例子.. <p><b>法国国营铁路公司(SNCF)20日承认,</b>新订购的2000列火 ...
- File类
存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用.由于数据存储在文 ...
- &12 二叉搜索树
#1,定义 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...
- python生成汉字图片字库
最近做文档识别方面的项目,做汉字识别需要建立字库,在网上找了各种OCR,感觉都不好,这方面的技术应该比较成熟了,OCR的软件很多,但没有找到几篇有含金量量的论文,也没有看到哪位大牛公开字库,我用pyg ...
- EMV内核使用中的常见问题
EMV内核在使用上会由于调用不当引起的许多问题,本文旨在基于内核LOG(也就是与IC卡交互的指令LOG)的基础上,对一些常见问题作初步的分析与解答,方便不熟悉EMV规范的同学参考. 本文的前提是你已经 ...
- 高性能JavaScript DOM编程
我们知道,DOM是用于操作XML和HTML文档的应用程序接口,用脚本进行DOM操作的代价很昂贵.有个贴切的比喻,把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用 ...
- MVC Form异步请求
@using (Ajax.BeginForm("CreateReviewInfo", "Review", new AjaxOptions { HttpMetho ...
- echarts .NET类库开源
前言: 2012年从长沙跑到深圳,2016年又从深圳回到长沙,兜兜转转一圈,又回到了原点.4年在深圳就呆了一家公司,回长沙也是因为深圳公司无力为继,长沙股东老板挽留,想想自己年纪也不小了.就回来了,在 ...
- nodejs学习之实现http数据转发
此前在做项目的时候,一直用json文件用作模拟数据,后来发现了mock.js,于是就用了mock.js,再后来感觉这些数据再怎么模拟都是静态数据.所以就想用nodejs实现一个数据转发功能,在本地拉取 ...