LibreOJ2095 - 「CQOI2015」选数
Description
给出\(n,k,L,R(\leq10^9)\),求从\([L,R]\)中选出\(n\)个可相同有顺序的数使得其gcd为\(k\)的方案数。
Solution
记\(f(x)\)表示gcd为\(x\)时的方案数,那么我们要求的就是\(f(k)\)。设\(F(x)=\sum_{x|d}f(d)\)表示gcd为\(x\)的倍数时的方案数,即\(F(x)=(⌊\dfrac{R}{x}⌋-⌊\dfrac{L-1}{x}⌋)^n\)。于是我们得到
f(k) &= \sum_{k|d}\mu(\frac{k}{d})F(d) \\
&= \sum_{i=1}^{+∞}\mu(i)(⌊\frac{R}{ik}⌋-⌊\frac{L-1}{ik}⌋)^n \\
&= \sum_{i=1}^{+∞}\mu(i)(⌊\frac{⌊\frac{R}{k}⌋}{i}⌋-⌊\frac{⌊\frac{L-1}{k}⌋}{i}⌋)^n
\end{align*}$$ 于是$\mu(x)$用杜教筛+map求前缀和,后面的部分整除分块即可。
##Code
```cpp
//「CQOI2015」选数
#include <cstdio>
#include <map>
typedef long long lint;
using std::map;
inline int min(int x,int y) {return x<y?x:y;}
const int P=1e9+7;
const int N=2e6+10;
int n0;
int prCnt,pr[N]; bool prNot[N];
int mu[N],sum0[N];
void init(int n)
{
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!prNot[i]) pr[++prCnt]=i,mu[i]=-1;
for(int j=1;j<=prCnt;j++)
{
int x=i*pr[j];
if(x>n) break;
prNot[x]=true;
if(i%pr[j]) mu[x]=-mu[i];
else break;
}
}
for(int i=1;i<=n;i++) sum0[i]=sum0[i-1]+mu[i];
}
map<int,int> S;
map<int,bool> get;
int sum(int x)
{
if(x<=n0) return sum0[x];
if(get[x]) return S[x];
int r=1;
for(int L=2,R;L<=x;L=R+1)
{
int v=x/L; R=x/v;
r=(r-1LL*(R-L+1)*sum(v)%P+P)%P;
}
get[x]=true; return S[x]=r;
}
int pow(int x,int y)
{
int r=1,t=x;
for(int i=y;i;i>>=1,t=(1LL*t*t)%P) if(i&1) r=(1LL*r*t)%P;
return r;
}
int main()
{
int n,k,a,b; init(n0=2e6);
scanf("%d%d%d%d",&n,&k,&a,&b);
a=(a-1)/k,b=b/k;
lint ans=0;
for(int L=1,R;L<=b;L=R+1)
{
int v1=b/L,v2=a/L; R=v2?min(b/v1,a/v2):b/v1;
ans=(ans+1LL*(sum(R)-sum(L-1)+P)*pow(v1-v2,n)%P)%P;
}
printf("%lld\n",ans);
return 0;
}
```
##P.S.
因为$\mu(x)$的部分和有可能是负数,所以运算之前要加一个$10^9+7$变成正数...\]
LibreOJ2095 - 「CQOI2015」选数的更多相关文章
- 「CQOI2015」选数
「CQOI2015」选数 题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都 ...
- 「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来个点在路径 ...
随机推荐
- 2407: C语言习题 整数转换成字符串
2407: C语言习题 整数转换成字符串 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 917 Solved: 416[Submit][Status] ...
- MySQL-08 MySQL8.0新特性
性能 MySQL 8.0 在一定的用户访问条件下,速度要比 MySQL 5.7 快 2 倍.MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载.IO 密集型工作负载.以及高竞争(" ...
- 已知一棵完全二叉树,求其节点的个数 要求:时间复杂度低于O(N),N为这棵树的节点个数
package my_basic.class_4; public class Code_08_CBTNode { // 完全二叉树的节点个数 复杂度低于O(N) public static class ...
- ADO 输入输出文本及获取指定字符串
---恢复内容开始--- 1.获取文本:声明别量,指定文本路径,获取文本内容. string Text=System.IO.File.ReadAllText(@"C:\xxx\xxx\xxx ...
- springboot下https证书配置
没有证书的小伙伴首先申请一个阿里云免费证书,按照我的步骤来操作 1.购买页面是这样的 按照顺序选择 神奇的一幕出现了 然后就去购买成功,我们会看到证书没有签发,我们需要去申请 填写需要绑定的域名 一般 ...
- 【Ubuntu】ubuntu基本操作命令
本文主要是用于记录ubuntu中会使用到的命令,但是有不是特别常用的,用于自己后续查阅使用. 1.查询ubuntu版本信息 方法一: cat /etc/issue 方法二: sudo lsb_rele ...
- nginx日志相关优化安全
一.编写脚本实现nginx access日志轮询 配置日志切割脚本,如下: [root@nginx shell]# cat cut_nginx_log.sh #!/bin/bash #Author:M ...
- 【mac】【转发】Mac系统升级后,按大小写键没反应了,切换大小写的灯不亮了
Mac系统升级后发现caps lock 锁定大小写的键,失灵了,居然可以用来切换输入法了,经过一排查后, 使用以下几种方法处理: 方式一:长按 caps lock 键,来切换大小写 方式二:caps ...
- 谷歌放弃“不作恶” Alphabet要“遵守法律互相尊重”
对于一些谷歌粉而言,谷歌那条“不作恶(Don’t be evil)”的行为准则是他们引以为傲的精神信仰.这一准则于1999年被首次确认,谷歌在2004年申请上市时也提到了这一点.不过现在这一点要改变了 ...
- python之序列化
什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 把字符转换成内存数据类型,叫反序列化. 为什么要序列化? 你 ...