[HNOI2002]跳蚤 【容斥】

时间:2022-10-08 00:22:24

题目描述

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容斥&plus;分解质因数)

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

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

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

  3. &lbrack;BZOJ1220&rsqb;&lbrack;POJ1091&rsqb;&lbrack;HNOI2002&rsqb;跳蚤

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

  4. luoguP2231 &lbrack;HNOI2002&rsqb;跳蚤

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

  5. BZOJ1220 HNOI2002 跳蚤 【容斥原理&plus;高精度】&ast;

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

  6. P2231 &lbrack;HNOI2002&rsqb;跳蚤

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

  7. HDU 4059 容斥初步练习

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

  8. HDU 4336 Card Collector &lpar;期望DP&plus;状态压缩 或者 状态压缩&plus;容斥&rpar;

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

  9. 【BZOJ-4455】小星星 容斥 &plus; 树形DP

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

随机推荐

  1. js中join和split的用法

  2. AfxOleInit&lpar;&rpar;和&colon;&colon;CoInitialize&lpar;NULL&rpar;区别

    From: http://blog.csdn.net/zhoubl668/archive/2009/04/30/4139933.aspx OLE是建立在COM之上的技术,层次比COM要高.AfxOle ...

  3. SmartCoder每日站立会议09

    站立会议内容 今天约了在一起编程,详细确定各个页面以及消息的添加.发送等一些小的细节. 1.站立会议照片:      2.任务展板 2.燃尽图

  4. HDU 6092&grave;Rikka with Subset 01背包变形

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. &period;net core 设置访问静态资源

  6. Yaml语法使用

    YAML概要 1. 认识 YAML YAML是一个类似 XML.JSON 的标记性语言.YAML 强调以数据为中心,并不是以标识语言为重点.因而 YAML 本身的定义比较简单,号称“一种人性化的数据格 ...

  7. scrapy 爬取小说

    QiushuSpider # -*- coding: utf-8 -*- import scrapy import time from qiushu.items import QiushuItem c ...

  8. js替换全部,js检查输入的日期是否是一个正确的日期格式

    <script language="javascript"> var str = "我爱的人和爱我的人,我爱的人和爱我的人"; var newstr ...

  9. Expo大作战&lpar;三十二&rpar;--expo sdk api之Noifications

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  10. PHP指定概率算法

    转载来源链接: https://blog.csdn.net/sinat_35861727/article/details/54980807 PHP指定概率算法,可用于刮刮卡,大转盘等抽奖算法. 假设: ...