题目描述

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后,显然一共有MN张不同的卡片。现在的问题是,在这所有的卡片中,有多少张可以完成任务。

输入输出格式

输入格式:

输入文件有且仅有一行,包括用空格分开的两个整数N和M。

输出格式:

输出文件有且仅有一行,即可以完成任务的卡片数。

1≤N≤M≤1081\le
N\le M\le 10^81≤N≤M≤108,且MN≤1016MN\le
10^{16}MN≤1016。

输入输出样例

输入样例#1:
复制

2 4
输出样例#1:
复制

12

说明

这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)

题解

这道题解题的思维量不小,且涵盖了较多数论知识点,是一道好题,记录下来【02年省选题就那么难了么QAQ】

由N + 1个数组合能跳到左边一格,由扩欧我们知道,这是互质的充要条件
所以M和前N个数至少有一对互质

直接讨论发现很麻烦,我们就反过来,用总方案 - 所有数不互质的方案数
总方案M^N个很明显了,如果所有数不互质,它们至少有一个公共的质因子,所以我们枚举M的质因子
假设M = 30 = 2 * 3 * 5
我们设它们共有2,就总共有(M/2)^N种可能【M/2表示M中有多少2的倍数】
我们设它们共有3,就总共有(M/3)^N种可能
我们设它们共有5,就总共有(M/5)^N种可能

不对啊,好像减多了,那么就两两组合,再加上去,加多了就三三组合减回去........

没错,就是容斥原理


具体实现时,质因子分解用快速分解法O(√M)分解,
容斥时我们枚举二进制数进行容斥

搞完啦~

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define fo(i,x,y) for (int i = (x); i <= (y); i++)
#define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
using namespace std;
const int maxn = 1005,maxm = 100005,INF = 1000000000; LL N,M;
int fac[maxn],faci = 0; void Sp(){
LL e = M;
for (LL i = 2; i * i <= e; i++){
if (e % i == 0){
fac[++faci] = i;
while (e % i == 0) e /= i;
}
}
if (e - 1) fac[++faci] = e;
} LL qpow(LL a,LL b){
LL ans = 1;
for (; b; b >>= 1, a *= a)
if (b & 1) ans *= a;
return ans;
} LL cal(int s){
LL mult = 1,pos = 1;
for (int i = 1; s; i++,s >>= 1){
if (s & 1){
mult *= fac[i];
pos *= -1;
}
}
return qpow(M/mult,N) * pos;
} void solve(){
Sp();
LL tot = qpow(M,N),maxv = ((LL)1 << faci) - 1;
for (int s = 1; s <= maxv; s++)
tot += cal(s);
cout<<tot<<endl;
} int main()
{
cin>>N>>M;
solve();
return 0;
}


[HNOI2002]跳蚤 【容斥】的更多相关文章

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

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

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

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

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

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

  4. luoguP2231 [HNOI2002]跳蚤

    题目链接 bzoj1220: [HNOI2002]跳蚤 题解 根据裴蜀定理,不定方程的解为未知数的gcd,所以选取的n个数的gcd为1 那么n - 1个数保证没有公约数为m的约数,枚举质因数容斥 质因 ...

  5. BZOJ1220 HNOI2002 跳蚤 【容斥原理+高精度】*

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

  6. P2231 [HNOI2002]跳蚤

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

  7. HDU 4059 容斥初步练习

    #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...

  8. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  9. 【BZOJ-4455】小星星 容斥 + 树形DP

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 137[Submit][Status] ...

随机推荐

  1. 查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件

    查看Oracle数据库表空间大小(空闲.已使用),是否要增加表空间的数据文件 1.查看表空间已经使用的百分比 Sql代码 select a.tablespace_name,a.bytes/1024/1 ...

  2. Bug 级别定义标准

    缺陷种类 缺陷级别 详细说明 功能缺陷 Urgent (V级) 1.操作系统无法正常使用,死机,出现致命错误 2.数据丢失 3.被测试系统频繁崩溃,程序出错,使功能不能继续使用 4.性能与需求不一致 ...

  3. 利用xlsxwriter生成数据报表

    #!/usr/bin/env python# -*- coding:utf-8 -*-import os,xlsxwriter,datetimeimport ConfigParserfrom send ...

  4. Python基础灬补充(循环、格式化输出)

    for循环&格式化输出 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' for year in range(2000, 2013): print("%s年的生肖是:% ...

  5. 239. [LeetCode ]Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  6. 如何隐藏掉SQL Server中自带系统数据库,数据表,存储过程等显示文件,只显示用户的数据库,数据表等文件

    企业管理器了,---->   编辑该数据库的注册属性--->“常规”属性页下面-->“显示系统数据库和系统对象”的选项去掉

  7. 微软职位内部推荐-Software Engineer II-Data Mining

    微软近期Open的职位: Are you looking for a big challenge? Do you know why Big Data is the next frontier for ...

  8. CF刷刷水题找自信 2

    CF 1114A  Got Any Grapes(葡萄)? 题目意思:给三个人分葡萄,三个人对葡萄的颜色有一些要求,问所准备的三种颜色的葡萄能否满足三人的要求. 解题意思:直接按条件判断即可. #in ...

  9. 《JavaScript》web客户端存储

    Web存储: 兼容IE8在内的所有主流浏览器,不兼容早期浏览器:支持大容量但非无限量 LocalStorage和sessionStorage是window对象的两个属性,这两个属性都代表同一个stor ...

  10. 第15章 磁盘配额(Quota)与高级文件系统管理

    磁盘配额(quota)的应用与实践 什么是quota 举例来说,用户的默认主文件夹是在/home下面,如果/home是个独立的分区,假设是10G,/home下有30个账号,这样30个用户共享这10G的 ...