Description###

我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案。小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究。然而他很快发现工作量太大了,于是向你寻求帮助。你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个。由于方案数较大,你只需要输出其除以1000000007的余数即可。

Input###

输入一行,包含4个空格分开的正整数,依次为N,K,L和H。

Output###

输出一个整数,为所求方案数。

Sample Input###

2 2 2 4

Sample Output###

3

HINT###

样例解释

所有可能的选择方案:(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2), (4, 3), (4, 4)

其中最大公约数等于2的只有3组:(2, 2), (2, 4), (4, 2)

对于100%的数据,1<=N,K<=109,1<=L<=H<=109,H-L<=10^5


想法##

最初的想法是莫比乌斯反演,但写了一半发现好麻烦,还要杜教筛之类的。。。

于是放弃!上普通容斥!

我们发现 \(H-L \leq 10^5\) ,那对于这个范围内,任意两不同的数的gcd \(\leq 10^5\)

(这个应该还是挺显然的。这两个数的差一定是它们gcd的倍数)

我们先把L与H处理一下,都除以K,将问题转变为求某一区间\([l,r]\)内选N个数gcd为1的方案数。

设 \(f[i]\) 表示该区间内选N个数(这N个数不全相同),gcd为i的方案数 (一会儿我会解释为什么要N个数不全相同)

那么 $f[i]=[r/i-l/i]^n - [r/i-l/i] - \sum\limits_{i|j} f[j] $

其中减去的 $[r/i-l/i] $ 便是N个数都相同的情况。

最后需要特判一下是否N个数可以都取K,若可以答案为\(f[1]+1\),否则为\(f[1]\)

好,现在解释一下为什么\(f[i]\)中选的N个数不全相同(想了好久才明白qwq)

一开始我想的是,计算\(f[i]\)时不需减掉 \([r/i-l/i]\),因为所有 \(f[i]\) 都带上 \((i,i,i,i,…)\) ,在 $ - \sum\limits_{i|j} f[j]$ 时肯定会被消掉。

可是,对于区间\([l,r]\)中的任意一个数x, \((x,x,x,x,x…)\) 的gcd为x,可能是超过\(10^5\)的。

而我们的\(f[i]\)最多只到\(10^5\),所以如果\(f[i]\)包括N个数都相同的情况的话,会有一些 \((x,x,x,x,…)\) 没有被减掉

而我们又知道,若N个数都相同且gcd为K,那只有这N个数都为K这一种情况。对这种情况特判一下就可以了。


一个小总结##

莫比乌斯反演与普通容斥的异同:

对于这道题的条件,两者都可以由 \(F(i)=f(i)+f(2i)+f(3i)+…\) 的式子写成,其中\(F(i)\)极其好求,而\(f(i)\)是我们需要的答案。

莫比乌斯反演是只通过\(F()\)求\(f()\),用到莫比乌斯函数

而普通容斥的做法就是递推,通过\(F()\)及\(f()\) 求\(f()\)

一般来说莫比乌斯反演时间复杂度可以优化到\(O(\sqrt{n})\),比普通容斥快;而普通容斥比莫比乌斯反演好写许多。

所以要具体问题具体分析,再决定用哪种做法。


代码##

#include<cstdio>
#include<iostream>
#include<algorithm> #define P 1000000007 using namespace std; typedef long long ll;
const int N = 100005; ll Pow_mod(int x,int y){
ll ret=1;
while(y){
if(y&1) ret=(ret*x)%P;
x=((ll)x*x)%P; //别忘了临时转long long !!!
y>>=1;
}
return ret;
} int n,K,L,H,l,r,m;
ll f[N]; int main()
{
scanf("%d%d%d%d",&n,&K,&L,&H);
l=(L-1)/K; r=H/K;
m=r-l; int x;
for(int i=m;i>0;i--){
x=r/i-l/i;
if(x<=0) continue;
f[i]=(Pow_mod(x,n)-x+P)%P;
for(int j=i*2;j<=m;j+=i)
f[i]=(f[i]-f[j]+P)%P;
}
if(L<=K && K<=H) f[1]=(f[1]+1)%P;
printf("%lld\n",f[1]); return 0;
}

[bzoj3930] [洛谷P3172] [CQOI2015] 选数的更多相关文章

  1. 洛谷P3172 [CQOI2015]选数(容斥)

    传送门 首先,进行如下处理 如果$L$是$K$的倍数,那么让它变成$\frac{L}{K}$,否则变成$\frac{L}{K}+1$ 把$H$变成$\frac{H}{K}$ 那么,现在的问题就变成了在 ...

  2. 【洛谷p1036】选数

    (一定要声明我太蒟了,这个题扣了一上午……) 算法标签: …… dfs真的不是我所擅长的qwq,这道题的思路其实很简单,就是先dfs搜索所有可能的和,然后判断是不是质数.说着好说,然鹅并不好写: 第一 ...

  3. P3172 [CQOI2015]选数(莫比乌斯反演)

    [题目链接] https://www.luogu.org/problemnew/show/P3172 [题解] https://www.luogu.org/blog/user29936/solutio ...

  4. luogu P3172 [CQOI2015]选数

    传送门 颓了一小时柿子orz 首先题目要求的是\[\sum_{x_1=l}^{r}\sum_{x_2=l}^{r}...\sum_{x_n=l}^{r}[gcd(x_1,x_2...x_n)=k]\] ...

  5. 洛谷 [CQOI2015]选数 解题报告

    [CQOI2015]选数 题目描述 我们知道,从区间\([L,H]\)(\(L\)和\(H\)为整数)中选取\(N\)个整数,总共有\((H-L+1)^N\)种方案. 小\(z\)很好奇这样选出的数的 ...

  6. 【BZOJ3930】[CQOI2015]选数 莫比乌斯反演

    [BZOJ3930][CQOI2015]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律 ...

  7. bzoj3930[CQOI2015]选数 容斥原理

    3930: [CQOI2015]选数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1383  Solved: 669[Submit][Status] ...

  8. BZOJ 3930: [CQOI2015]选数 递推

    3930: [CQOI2015]选数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pro ...

  9. [CQOI2015]选数(莫比乌斯反演,杜教筛)

    [CQOI2015]选数(luogu) Description 题目描述 我们知道,从区间 [L,H](L 和 H 为整数)中选取 N 个整数,总共有 (H-L+1)^N 种方案. 小 z 很好奇这样 ...

随机推荐

  1. H3C配置Trunk端口

  2. yum安装错误:CRITICAL:yum.cli:Config Error: Error accessing file for config file:///home/linux/+

    上网搜了一下然后自己总结一份 : 出现原因:yum可能没有,或者损坏 解决: 第一步:下载   wget  http://yum.baseurl.org/download/3.2/yum-3.2.28 ...

  3. vue-learning:0 - 目录

    Vue-learning vue.js学习路径 Vue的API地图 点击查看vue的API地图 视图层 点击可直接到达详情页面 指令 {{ }} / v-html v-if / v-else / v- ...

  4. vim 方式快捷编辑代码

    说明 **I: ** 行首插入 **a: ** 追加 **A: ** 行尾插入 **R: ** 替换文字 **v: ** 选择 **ctrl-v: ** 选择举行区域 **x: ** 删除 **dd: ...

  5. VRchat模型之unity

    VRChat模型制作及上传总篇(包含总流程和所需插件):https://www.cnblogs.com/raitorei/p/12015876.html 0.新建工程, 导入VRCSDK及动态骨骼插件 ...

  6. Java核心技术·卷 II(原书第10版)分享下载

    Java核心技术·卷 II 内容介绍 Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与<Java编程思想>齐名,10余年 ...

  7. 经典问题(c++/python)素数、杨辉三角(金字塔型)、统计单词数、简单计算器、密码安全程度、凯撒密码加密、汉诺塔 (python课设实验实例)-- biaobiao88

    [编写程序,输人一个大于2的自然数,然后输出小于该数字的所有素数组成的列表.]所谓素数,是指除了1和自身之外没有其他因数的自然数,最小的素数是2,后面依次是3.5.7.11.13... c++代码: ...

  8. 从头学pytorch(十一):自定义层

    自定义layer https://www.cnblogs.com/sdu20112013/p/12132786.html一文里说了怎么写自定义的模型.本篇说怎么自定义层. 分两种: 不含模型参数的la ...

  9. $loj\ 2031\ [SDOI2016]$数字配对 网络流

    正解:网络流 解题报告: 我永远喜欢$loj$! 显然先预处理哪些$a$之间可以连边,然后考虑建两排点,连流量为$c_{i}\cdot c_{j}$,然后$ST$连$inf$,跑个费用流? 然后现在碰 ...

  10. $POJ$2976 $Dropping\ tests$ 01分数规划+贪心

    正解:01分数规划 解题报告: 传送门! 板子题鸭,,, 显然考虑变成$a[i]-mid\cdot b[i]$,显然无脑贪心下得选出最大的$k$个然后判断是否大于0就好(,,,这么弱智真的算贪心嘛$T ...