【BZOJ】3930: [CQOI2015]选数
题意
从区间\([L, R]\)选\(N\)个数(可以重复),问这\(N\)个数的最大公约数是\(K\)的方案数。(\(1 \le N, K \le 10^9, 1 \le L \le R \le 10^9, H-L \le 10^5\))
分析
好神的题。注意\(H-L \le 10^5\)这个条件,则假设\(N\)个数不全相同,那么他们的最大公约数小于最大和最小的两个数之差,证明很简单,设\(d\)为最大公约数,则\(dk_2 -dk_1 = d( k_2 - k_1 ) > d\)
题解
因此我们可以先算出\(N\)个数不全相同的方案数,然后再特判一下全相同的情况,加起来就是答案了。
计算前者我们可以将边界除以\(K\),然后在新边界里面找最大公约数为\(1\)的方案数。由于新边界最大于最小之差不超过\(10^5\),因此我们暴力枚举一下这些公约数,用容斥剪掉重复的即可。也就是说:
\]
\(sum\)的计算注意剪掉\(N\)个数相同的方案。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mo=1000000007;
int ipow(int a, int b) {
int x=1;
a%=mo;
for(; b; b>>=1, a=(ll)a*a%mo)
if(b&1) x=(ll)x*a%mo;
return x;
}
int d[100005];
int main() {
int N, K, L, R, MX, flag=0;
scanf("%d%d%d%d", &N, &K, &L, &R);
if(L<=K && K<=R) flag=1;
L=(L-1)/K, R=R/K;
MX=R-L;
for(int i=MX; i>=1; --i) {
int &now=d[i];
ll l=L/i, r=R/i, t=r-l;
if(l<r) {
now=(ipow((t), N)-t+mo)%mo;
for(int j=i<<1; j<=MX; j+=i) now=(now-d[j]+mo)%mo;
}
}
printf("%d\n", d[1]+flag);
return 0;
}
【BZOJ】3930: [CQOI2015]选数的更多相关文章
- BZOJ 3930: [CQOI2015]选数 递推
3930: [CQOI2015]选数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pro ...
- 【刷题】BZOJ 3930 [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- bzoj 3930: [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- BZOJ 3930: [CQOI2015]选数 莫比乌斯反演
https://www.lydsy.com/JudgeOnline/problem.php?id=3930 https://blog.csdn.net/ws_yzy/article/details/5 ...
- 【递推】BZOJ 3930: [CQOI2015]选数
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- bzoj 3930: [CQOI2015]选数【快速幂+容斥】
参考:https://www.cnblogs.com/iwtwiioi/p/4986316.html 注意区间长度为1e5级别. 则假设n个数不全相同,那么他们的gcd小于最大数-最小数,证明:则gc ...
- bzoj 3930: [CQOI2015]选数【递推】
妙啊 这个题一上来就想的是莫比乌斯反演: \[ f(d)=\sum_{k=1}^{\left \lceil \frac{r}{d} \right \rceil}\mu(k)(\left \lceil ...
- BZOJ 3930: [CQOI2015]选数 莫比乌斯反演 + 杜教筛
求 $\sum_{i=L}^{R}\sum_{i'=L}^{R}....[gcd_{i=1}^{n}(i)==k]$ $\Rightarrow \sum_{i=\frac{L}{k}}^{\fra ...
- 3930: [CQOI2015]选数
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1958 Solved: 979[Submit][Status][Discuss] Descripti ...
随机推荐
- 查看修改Linux时区和时间
查看/修改Linux时区和时间 一.时区 1. 查看当前时区 date -R 2. 修改设置时区 方法(1) tzselect 方法(2) 仅限于RedHat Linux 和 CentOS timec ...
- jquery 判断网络资源,网络文件是否存在
前提是,不能跨域访问引入jquery库<script src="jQuery.js" type="text/javascript"></scr ...
- width的数值为百分比
对于width的数值为百分比的时候,表示该元素的长度是相对于父容器来算的. 对于padding-right和padding-left比较好理解也是相对于父容器来算的,但容易出错的是padding-to ...
- 如何快速上手使用STM32库函数
一.背景 如前文所述,利用标准库函数的好处在于,可以快速开发,不用去对着数据手册,小心翼翼的一位一位的配置那些繁复的寄存器,因为这些工作意法半导体已经找了一些顶级的工程师帮你做了,杰作既是其库函数.当 ...
- 如何修改Xampp中MySQL的root密码?
MySQL 的“root”用户默认状态是没有密码的,所以在 PHP 中您可以使用 mysql_connect("localhost","root"," ...
- C和指针 第八章 习题
8.5矩阵运算,A是一个x行,y列矩阵,B是y行z列矩阵,把A和B相乘,结果是另外一个x行z列矩阵,每个位置的值由下公式决定,编写函数: #include <stdio.h> void m ...
- C/C++ 结构体内存对齐
内存对齐是指的是编译器在编译的时候总是会将结构体的元素的地址放在一些合适的位置使得CPU访问这些数据的效率变得更高.首先来看下面这个例子: struct A{ char a; char b; int ...
- main(int argc, char **argv)参数解读
main(int argc, char **argv)参数解读 编译生成了test.exe ,然后在控制台下相应的目录下输入:test 1 2 3 4 argc就是一个输入了多少个参数,包括te ...
- opencv二值化处理
#include "stdafx.h"//对一张图片进行二值化处理 IplImage *pSrclmg =NULL;//载入的图片IplImage *pDeclmg =NULL;/ ...
- opencv常见代码
http://blog.csdn.net/lyc_daniel/article/details/16883707