「CQOI2015」选数
「CQOI2015」选数
题目描述
我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案。小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究。然而他很快发现工作量太大了,于是向你寻求帮助。你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个。由于方案数较大,你只需要输出其除以1000000007的余数即可。
输入输出格式
输入格式:
输入一行,包含4个空格分开的正整数,依次为N,K,L和H。
输出格式:
输出一个整数,为所求方案数。
输入输出样例
说明
样例解释
所有可能的选择方案:(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<=10^9,1<=L<=H<=10^9,H-L<=10^5
杜教筛题解
首先,将gcd为K进行经典转化:把\(L\)变为\(\lceil\frac{L}{K}\rceil\),把\(R\)变成\(\lfloor\frac{R}{K}\rfloor\)。
这样子容易得出,现在要求的就是在\([L,R]\)之间,选数\(N\)次使选出的数最大公约数为\(1\)的方案数。
\sum_{i_{1\sim N}=L}^R\sum_{d|i_{1\sim N}}\mu(d)\\
=\sum_{d=1}^R\mu(d)(\lfloor\frac Rd\rfloor-\lfloor\frac{L-1}d\rfloor)^N
\]
然后杜教筛加整除分块即可。时间复杂度\(O((\frac RK)^\frac 23+\sqrt{R}\log N)\)
#include<bits/stdc++.h>
#define il inline
#define co const
template<class T>T read(){
T data=0,w=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
return data*w;
}
template<class T>il T read(T&x) {return x=read<T>();}
typedef long long LL;
co int N=1e6+1;
int pri[N],tot,mu[N];
void init(){
pri[1]=mu[1]=1;
for(int i=2;i<N;++i){
if(!pri[i]) pri[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*pri[j]<N;++j){
pri[i*pri[j]]=1;
if(i%pri[j]==0){
mu[i*pri[j]]=0;
break;
}
mu[i*pri[j]]=-mu[i];
}
}
for(int i=2;i<N;++i) mu[i]+=mu[i-1];
}
std::map<int,int> smu;
int Mu(int n){
if(n<N) return mu[n];
if(smu.count(n)) return smu[n];
int ans=1;
for(int l=2,r;l<=n;l=r+1){
r=n/(n/l);
ans-=(r-l+1)*Mu(n/l);
}
return smu[n]=ans;
}
co int mod=1e9+7;
il int add(int a,int b){
return (a+=b)>=mod?a-mod:a;
}
il int mul(int a,int b){
return (LL)a*b%mod;
}
int fpow(int a,int b){
int ans=1;
for(;b;b>>=1,a=mul(a,a))
if(b&1) ans=mul(ans,a);
return ans;
}
int main(){
init();
int n=read<int>(),k=read<int>();
int L=(read<int>()-1)/k+1,R=read<int>()/k;
int ans=0;
for(int l=1,r;l<=R;l=r+1){
if((L-1)/l) r=std::min((L-1)/((L-1)/l),R/(R/l)); // edit 1:/0
else r=R/(R/l);
ans=add(ans,add(mod,mul(Mu(r)-Mu(l-1),fpow(R/l-(L-1)/l,n))));
}
printf("%d\n",ans);
return 0;
}
注意:整除分块的时候,因为是以R为上限,所以L-1那坨可能出现除以0的情况,需要特判。
xyz32768的容斥题解
现在要求的就是在\([L,H]\)之间,选数\(N\)次使选出的数最大公约数为\(1\)的方案数。
现在,用\(f[i]\)表示选出的数的最大公约数\(i\)且选出的数不全相同的方案数。此时先求出\([L,H]\)之间\(i\)的倍数的个数\(x\),暂时令\(f[i]=x^N-x\)。
但此时得到的\(f[i]\)实际上是含有公约数\(i\)的方案数,不是最大公约数为\(i\)的方案数。但是可以发现,此时的\(f[i]\)包含有最大公约数为\(i,2i,3i,...\)的方案数。这时候使用容斥原理:假设已经知道了\(f[2i],f[3i],...\)的最终结果,那么就把\(f[i]\)分别减去\(f[2i],f[3i],...\),就可以得到\(f[i]\)的最终结果。倒着推一遍。
特殊情况:\(L=1\)时可以所有的数都选\(1\)。所以\(L=1\)时答案要加\(1\)。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() {
int res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
return bo ? ~res + 1 : res;
}
const int N = 1e5 + 5, PYZ = 1e9 + 7;
int n, K, L, H, f[N];
int qpow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = 1ll * res * a % PYZ;
a = 1ll * a * a % PYZ;
b >>= 1;
}
return res;
}
int main() {
int i, j; n = read(); K = read(); L = read(); H = read();
if (L % K) L = L / K + 1; else L /= K; H /= K;
if (L > H) return puts("0"), 0;
for (i = 1; i <= H - L; i++) {
int l = L, r = H;
if (l % i) l = l / i + 1; else l /= i; r /= i;
if (l > r) continue;
f[i] = (qpow(r - l + 1, n) - (r - l + 1) + PYZ) % PYZ;
}
for (i = H - L; i; i--) for (j = (i << 1); j <= H - L; j += i)
f[i] = (f[i] - f[j] + PYZ) % PYZ;
if (L == 1) (f[1] += 1) %= PYZ; cout << f[1] << endl;
return 0;
}
「CQOI2015」选数的更多相关文章
- LibreOJ2095 - 「CQOI2015」选数
Portal Description 给出\(n,k,L,R(\leq10^9)\),求从\([L,R]\)中选出\(n\)个可相同有顺序的数使得其gcd为\(k\)的方案数. Solution 记\ ...
- 「FJOI2016」神秘数 解题报告
「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...
- LibreOJ2097 - 「CQOI2015」任务查询系统
Portal Description 给出\(n(n\leq10^5)\)个任务,和总时间范围\(m(m\leq10^5)\).每个任务有开始/结束时间\(s_i,e_i(1\leq s_i \leq ...
- 【LOJ】#3094. 「BJOI2019」删数
LOJ#3094. 「BJOI2019」删数 之前做atcoder做到过这个结论结果我忘了... em,就是\([1,n]\)之间每个数\(i\),然后\([i - cnt[i] + 1,i]\)可以 ...
- 「BZOJ3505」[CQOI2014] 数三角形
「BZOJ3505」[CQOI2014] 数三角形 这道题直接求不好做,考虑容斥,首先选出3个点不考虑是否合法的方案数为$C_{(n+1)*(m+1)}^{3}$,然后减去三点一线的个数就好了.显然不 ...
- 「CQOI2015」任务查询系统
「CQOI2015」任务查询系统 传送门 好像也是板子题??? 区间修改,单点查询,考虑差分. 然后每次查询时就直接在对应的主席树上二分即可. 参考代码: #include <cstdio> ...
- 【BZOJ】【3930】【CQOI2015】选数
数论/莫比乌斯反演/快速mu前缀和 比较容易想到令f[x]表示gcd=x的方案数,令g[x]表示x|gcd的方案数. 那么有$ g(d)=\sum_{d|n} f(n)$,根据莫比乌斯反演,有$f(d ...
- BZOJ 3930 【CQOI2015】 选数
题目链接:选数 这种SB题我都Wa飞了,彻底没救系列- 首先,我们可以发现1,如果我们选了两个不同的数,那么它们的\(\gcd\)不会超过\(r-l+1\).于是,我们可以设一个\(f_i\)表示任取 ...
- 【LOJ】#2277. 「HAOI2017」方案数
题解 这个出题人完美诠释了什么叫 用心出题,用脚造数据 算完复杂度怎么也得\(O(o^2 * 200)\)略微跑不满,但是有8个测试点虽然有障碍但是一个障碍都不在路径上,2个测试点只有10来个点在路径 ...
随机推荐
- 记RDS数据库表数据误删恢复
1.登录阿里云RDS后台,找到“备份”入口,如下图: 2.下载最近的备份数据,如下图: 3.解压,找到误删数据的表,如下图:(这里拿sys_role举例) 4.在本机(Windows系统), a. 装 ...
- php_mvc实现步骤六
shop34-1-目录布局 存在项目的根目录 shop34 框架代码与应用程序代码划分 框架代码: 在各个应用程序间可以通用的代码. 应用程序代码: 当前项目的业务逻辑实现的代码. 分别创建两个子目录 ...
- 【RSR】RSR如何配置BGP与BFD联动(动态路由)
应用场景 企业租用运营商MSTP线路,配置BGP路由协议上网,由于企业本端出口路由器无法检测到运营商中间链路通信中断,导致路由收敛缓慢,无法快速的切换到其它备份线路,此时可以在路由器上启用BGP与BF ...
- 「模拟赛20191019」B 容斥原理+DP计数
题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输 ...
- FDD与TDD的区别
LTE通常分为FDD LTE和TDD LTEFDD,频分双工(Frequency Division Duplexing)我和你通信,像广播一样,只能我说你听,是单工:像对讲机一样,同一时间只能一方说, ...
- PHP设计模式 - 桥接模式
将抽象部分与它的实现部分分离,使他们都可以独立的变抽象与它的实现分离,即抽象类和它的派生类用来实现自己的对象 桥接与适配器模式的关系(适配器模式上面已讲解): 桥接属于聚合关系,两者关联 但不继承 适 ...
- Linux学习-基本命令文件操作
终端 1.多个终端 连接linux的客户端可以理解为终端. 命令:tty查看终端 2.不同终端之间的通讯 [root@wyx wyx]# echo 123 > /dev/pts/1 把123发给 ...
- 一起来学Spring Cloud | 第八章:消息总线(Spring Cloud Bus)
上一章节,我们讲解了分布式配置中心spring cloud config,我们把配置项存放在git或者本地,当我们修改配置时,需要重新启动服务才能生效.但是在生产上,一个服务部署了多台机器,重新启动比 ...
- Java开发笔记(一百一十九)AWT布局
前面介绍了如何在窗口上添加一个按钮,可是每个软件界面都包含了许多控件,这些控件又是按照什么规则在界面上排列的呢?仍以按钮为例,假如要在窗口上依次添加多个按钮,那么界面会怎样显示这些按钮?想当然的话,按 ...
- ansible-playbook的简单传参方式
基本语法: ansible-playbook -v -i myhost test.yml -e "name=xiaoming" // -v 是看运行细节.要更细节 ...