【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 ...
随机推荐
- Asp.net NVelocity 模版引擎
NVelocity.dll是Java中常用的一个模版,下面是常用的模版引擎 1,返回string类型的html代码 /// <summary> /// 获取html模版 /// </ ...
- css3在不同型号手机浏览器上的兼容一览表
网上搜集了css3对不同系统手机浏览器的支持情况(ios/android/winphone)备份一下以便查看. 以下资料由微信产品部"白树"整理, 转载请注明. √:完全支持 ...
- Windows 8.1 新增控件之 TimePicker
之前已经为大家介绍过DatePicker 控件的相关内容,有日期控件当然就得有时间控件,本篇将和各位一起了解TimePicker 的使用方法. 先来介绍一下ClockIdentifier 属性,默认情 ...
- iOS APNS配置(转)
Introduction To send Push notification to an application/device couple you need an unique device tok ...
- silverlight: http请求的GET及POST示例
http请求的get/post并不是难事,只是silverlight中一切皆是异步,所以代码看起来就显得有些冗长了,下面这个HttpHelper是在总结 园友 的基础上,修改得来: namespace ...
- lecture15-自动编码器、语义哈希、图像检索
Hinton第15课,本节有课外读物<Semantic Hashing>和<Using Very Deep Autoencoders for Content-Based Image ...
- Python2.2-原理之类型和运算
此节来自于<Python学习手册第四版>第二部分 一.Python对象类型(第4章) 1. Python可以分解成模块.语句.表达式以及对象:1.程序由模块构成:2.模块包含语句:3.语句 ...
- ArcGIS支持MongoDB数据源
ArcGIS支持MongoDB数据源 自从NoSQL推出之后,MongoDB就作为比较杰出的代表受到广大用户的推崇,当然,与之而来的大数据的讨论也非常激烈,GIS数据源向来都是以海量来计算,所以,GI ...
- HDU5878~HDU5891 2016网络赛青岛
A.题意:给出一个整数n, 找出一个大于等于n的最小整数m, 使得m的质因数只有2 3 5 7 分析:预处理出质因数2 3 5 7的数,超过maxt就行,然后找 B.题意:求1/1^2+1/2^2+. ...
- rabbitmq技术
Rabbitmq 初识rabbitmq RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现.如果不熟悉AMQP,直接看Rabbi ...