P2231 [HNOI2002]跳蚤
文章目录
- R e s u l t Result Result
- H y p e r l i n k Hyperlink Hyperlink
- D e s c r i p t i o n Description Description
- S o l u t i o n Solution Solution
- C o d e Code Code
R e s u l t Result Result
H y p e r l i n k Hyperlink Hyperlink
https://www.luogu.com.cn/problem/P2231
D e s c r i p t i o n Description Description
试着构造一个长度为 n n n的序列,使得它们的最大值不大于 m m m,并且它们的 g c d gcd gcd和 m m m的 g c d gcd gcd为1,问方案数
数据范围: n , m ≤ 1 0 8 , m n ≤ 1 0 16 n,m\leq 10^8,m^n\leq 10^{16} n,m≤108,mn≤1016
S o l u t i o n Solution Solution
直接统计貌似很难算,考虑用总得方案减去不合法的(即 g c d gcd gcd不为1的)
显然 g c d gcd gcd不为1当且仅当该序列的 g c d gcd gcd是 m m m的约数之一,我们设这个约数为 d d d
显然, m m m范围内满足约数为 d d d的数有 m d \frac m d dm个,从中任意挑选出 n n n个,它们的 g c d gcd gcd就是 d d d(或者 d d d的倍数),这样的方案数为 ( m d ) n (\frac m d)^n (dm)n。
根据上述括号中的内容,这样子算有可能 g c d gcd gcd不为 d d d而是 d d d的倍数(换句话说就是多算了),考虑容斥掉重复计算的,显然容斥系数就是 μ ( d ) \mu(d) μ(d)
所以得到总的式子 A n s = ∑ d ∣ m μ ( d ) × ( m d ) n Ans=\sum _{d|m} \mu(d)\times (\frac m d)^n Ans=∑d∣mμ(d)×(dm)n
如果直接暴力枚举 m m m的约数,再 m \sqrt m m 算 d d d的话,时间复杂度是 O ( m ) O(m) O(m)的,虽然跑不满,但是我们考虑优化它
两种做法,代码中采用的是后者
- 由于 m m m的质因子不超过8个(因为最小的8个质数的乘积大于 1 0 8 10^8 108),这样我们就可以 O ( 2 8 ) O(2^8) O(28)枚举 m m m的约数了,总得时间复杂度 O ( 2 8 m log n ) O(2^8\sqrt m\log n) O(28m logn)
- 考虑化一下式子,首先根据唯一分解定理对 m m m进行质因数分解,得到 m = ∏ p i c i m=\prod p_i^{c_i} m=∏pici,原式就可以化为 m n − ∑ 1 p i n + ∑ 1 p i n p j n − … … + … … m^n-\sum \frac 1{p_i^n}+\sum \frac 1{p_i^np_j^n}-……+…… mn−∑pin1+∑pinpjn1−……+……,有木有发现这玩意儿和 φ \varphi φ的容斥求法非常地相像?所以我们把后面那若干个 ∑ \sum ∑化为一个 ∏ \prod ∏,即 A n s = m n ∏ ( 1 − 1 p i n ) Ans=m^n\prod (1-\frac 1{p_i^n}) Ans=mn∏(1−pin1),就可以扔掉 μ \mu μ,复杂度 O ( m log n ) O(\sqrt m\log n) O(m logn)
C o d e Code Code
#include<cstdio>
#include<cctype>
#include<algorithm>
#define LL long long
using namespace std;LL n,m,res,inv;
inline LL ksm(LL x,LL y)
{LL res=1;for(;y;y>>=1,x*=x) if(y&1) res*=x;return res;
}
signed main()
{scanf("%lld%lld",&n,&m);inv=m;res=1;for(LL i=2;i*i<=m;i++)if(m%i==0){res*=ksm(i,n)-1;inv/=i;do{m/=i;}while(m%i==0);}if(m!=1) res*=ksm(m,n)-1,inv/=m;res*=ksm(inv,n);printf("%lld",res);
}
P2231 [HNOI2002]跳蚤相关推荐
- P2231 [HNOI2002]跳蚤(裴蜀定理/莫比乌斯反演)
P2231 [HNOI2002]跳蚤 给定一个长度为n+1的一列数,第n+1位为m,前n位小于m 求解使得他n+1个数的加减可以凑出1的方案数 首先可以凑出1,这显然是裴蜀定理,推一推就发现他要求所有 ...
- 洛谷P2231 [HNOI2002]跳蚤 [数论,容斥原理]
题目传送门 跳蚤 题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+ ...
- luoguP2231 [HNOI2002]跳蚤
题目链接 bzoj1220: [HNOI2002]跳蚤 题解 根据裴蜀定理,不定方程的解为未知数的gcd,所以选取的n个数的gcd为1 那么n - 1个数保证没有公约数为m的约数,枚举质因数容斥 质因 ...
- [HNOI2002]跳蚤
题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最 ...
- bzoj1588[HNOI2002]营业额统计
bzoj1588[HNOI2002]营业额统计 题意: n天,每天得到一个值,要求输出每一天和这天得到的值相差最小的之前天得到的值与这个值的差的和.n不知道,不过O(nlog2n)可写. 题解: 说是 ...
- 【链表】BZOJ1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 17555 Solved: 7179 [Submit][S ...
- POJ 1091 跳蚤
跳蚤 Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: 1091 64 ...
- [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)
[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...
- P2231-[HNOI2002]跳蚤【容斥】
正题 题目链接:https://www.luogu.com.cn/problem/P2231 题目大意 求一个由[1,m][1,m][1,m]的整数组成的长度为nnn的序列使得他们的gcdgcdgcd ...
最新文章
- SpringBoot配置文件YAML配置注入(详解)
- Datawhale数据分析教程来了!
- Spring Cloud分布式微服务云架构—源码结构图
- day15-pymysql模块的使用
- Python 基础中20 个小技巧
- 第二阶段scrum-3
- PHP专题-开发基础(七)
- LeetCode 467. 环绕字符串中唯一的子字符串(思维转换)
- linux-所有者与所属组的修改
- JavaScript:windows关机效果
- [iOS]自定义view使用xib
- 2017 ACM/ICPC(北京)总结
- python怎么注释掉一段代码_爬取出来的网页代码都被注释掉怎么解决?
- 凤凰项目:一个IT运维的传奇故事--阅读心得
- arp计算机病毒解决办法,“ARP病毒的解决方案”的解决方案
- 010Editor分析
- RouterOS(ROS)设置动态域名(DDNS)
- html网页什么样的字体最好看,css设置各种中文字体样式代码
- 机器学习系列15:学习曲线
- php输出世界时转北京时,php中把美国时间转为北京时间的自定义函数分享