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】 跳蚤的更多相关文章

  1. POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)

      题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...

  2. 【容斥原理】【分解质因数】poj1091 跳蚤

    题意转化为求一个线性组合a1*x1+a2*x2+...+an*xn+m*xn+1=1在什么时候可以有解.(ai在1~m的范围内任取) 易得当且仅当gcd(a1,a2,...,an)=1时可能有解. 然 ...

  3. Gcd&Exgcd算法学习小记

    Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...

  4. [BZOJ1220][POJ1091][HNOI2002]跳蚤

    [BZOJ1220][POJ1091][HNOI2002]跳蚤 试题描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长. ...

  5. 刷题总结——跳蚤(poj1091容斥+分解质因数)

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

  6. poj1091:跳蚤【容斥原理】

    题目大意:中文题就不翻译了 思路:假设跳蚤选择X1个第一张卡片,X2个第二张卡片...Xn个第n张卡片,Xn+1张写着m的卡片,那么就可以列出方程:a1*X1+a2*X2+…+an*Xn+m*X(n+ ...

  7. 北大poj-1091

    跳蚤 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9591   Accepted: 2892 Description Z ...

  8. 小JAVA大世界之程序建模跳蚤实验

    package com.chigoe;//房子类class House { private int m;// 保存行数 private int n;// 保存列数 private int[][] a; ...

  9. 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分

    4310: 跳蚤 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 180  Solved: 83[Submit][Status][Discuss] De ...

随机推荐

  1. TP框架实现分页

    TP框架自带分页的实现方法,所以使用这个分页方案,不用再重新造轮子 1,先看效果图 2,源码 /** * TODO 基础分页的相同代码封装,使前台的代码更少 * @param $m 模型,引用传递 * ...

  2. 将packages/apps/下的app导入eclipse

    当刚接触android自带的一个模块时,如何去熟悉它?相信不少人第一步都会尝试着去了解其内容的调用流程,而此时若能够单步调试则显得非常重要了,于是有了文章标题所说的尝试. 作者这里要导入的是Setti ...

  3. CUDA2.3-原理之任意长度的矢量求和与用事件来测量性能

    __global__ void add( int *a, int *b, int *c) { <span style="white-space:pre"> </s ...

  4. Windows下搭建PHP环境:Apache+PHP+MySQL

    本文简单记录一下Windows下搭建PHP环境的过程,一些细节可以参照本文参考资料,此文不再赘述 准备工作: Windows下手工搭建PHP环境需要先下载相应的软件,需要注意的是Apache与PHP的 ...

  5. ASP.NET MVC3入门教程之参数(数据)传递

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=98&extra=page%3D1 MVC模式的参数(数据)传递 ...

  6. Altera OpenCL用于计算机领域的13个经典案例(转)

    英文出自:Streamcomputing 转自:http://www.csdn.net/article/2013-10-29/2817319-the-application-areas-opencl- ...

  7. MySQL Workbench使用及教程

    MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库图示,建 ...

  8. Percona 开始尝试基于Ceph做上层感知的分布式 MySQL 集群,使用 Ceph 提供的快照,备份和 HA 功能来解决分布式数据库的底层存储问题

    本文由 Ceph 中国社区 -QiYu 翻译 英文出处:Using Ceph with MySQL 欢迎加入CCTG Over the last year, the Ceph world drew m ...

  9. 设计模式之UML类图的常见关系

    设计模式之UML类图的常见关系 本文来自转载 烧点饭博客 本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association), ...

  10. Java垃圾收集算法介绍

    垃圾回收器GC(Garbage Collection) 一.引用计数算法(Reference Counting) 介绍:给对象添加一个引用计数器,每当一个地方引用它时,数据器加1:当引用失效时,计数器 ...