【CQOI2015】选数
2024-08-30 06:48:50
题面
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)
【数据范围】
对于30%的数据,N≤5,H-L≤5
对于100%的数据,1≤N,K≤109,1≤L≤H≤109,H-L≤10^5
题目分析
设\(r=\lfloor\frac HK\rfloor,l=\lfloor\frac {L-1}K\rfloor\)
根据套路:\(\displaystyle ans=\sum_{d=1}^r\mu(d)(\lfloor\frac rd\rfloor-\lfloor\frac ld\rfloor)^N\)
由于\(r\)可能很大,需要用杜教筛处理\(\mu\)的前缀和。
杜教筛:
\[\begin{split}
(g*f)(i)&=\sum_{d|i}g(d)f(\frac id)\\
\Rightarrow g(1)S(n)&=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S(\frac ni)
\end{split}
\]
(g*f)(i)&=\sum_{d|i}g(d)f(\frac id)\\
\Rightarrow g(1)S(n)&=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S(\frac ni)
\end{split}
\]
其中,\(S(x)\)为\(f()\)的前缀和。
这次,我们的\(f\)为\(\mu\),根据杜教筛的套路,取\(g(x)=1\)。
\[\begin{split}
S(n)=1-\sum_{i=2}^nS(\frac ni)
\end{split}
\]
S(n)=1-\sum_{i=2}^nS(\frac ni)
\end{split}
\]
可以用线性筛预处理一部分\(\mu\)的前缀和,剩下的用杜教筛记忆化搜索即可。
代码实现
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<map>
#define MAXN 0x7fffffff
typedef long long LL;
const int N=1e7+5,M=1e7,mod=1000000007;
using namespace std;
inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
int mu[N],prime[N];
bool vis[N];
map<int,int>smu;
int Smu(int x){
if(x<=M)return mu[x];
if(smu[x])return smu[x];
int ret=1;
for(int l=2,r;l<=x;l=r+1){
r=x/(x/l);
ret-=(r-l+1)*Smu(x/l);
}
return smu[x]=ret;
}
LL ksm(LL x,LL k){
LL ret=1;
while(k){
if(k&1)ret=ret*x%mod;
x=x*x%mod,k>>=1;
}
return ret;
}
int main(){
mu[1]=1;
for(int i=2;i<=M;i++){
if(!vis[i])prime[++prime[0]]=i,mu[i]=-1;
for(int j=1;j<=prime[0]&&i*prime[j]<=M;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0)break;
mu[i*prime[j]]=-mu[i];
}
mu[i]+=mu[i-1];
}
int n=Getint(),K=Getint(),L=(Getint()-1)/K,R=Getint()/K;
int ans=0;
for(int l=1,r;l<=R;l=r+1){
r=R/(R/l);
if(l<=L)r=min(r,L/(L/l));
ans=(ans+1ll*(Smu(r)-Smu(l-1))*ksm(R/l-L/l,n)%mod)%mod;
}
cout<<(ans+mod)%mod;
return 0;
}
最新文章
- HTML5 网络拓扑图性能优化
- Union-Find 检测无向图有无环路算法
- [Centos 6]升级安装GCC(2)
- Unity3D——键盘控制移动
- 【BZOJ】2049: [Sdoi2008]Cave 洞穴勘测(lct/并查集)
- 关于更新Ubuntu14.04内核后,virtualbox无法开机vm的问题
- 我们都遇到过的 Replace Blank Space
- Intent的简介以及属性详解
- Linux中printf格式化输出
- mvc5 知识点01
- sublime 复制黏贴等快捷键修改
- 上传系列:jquery.upload.js
- Web页面向后台提交数据的方式和选择
- Angular - - angular.Module
- win10 uwp 绑定密码
- linux 中 svn 服务器搭建 重启
- 第60章 设备流交互服务 - Identity Server 4 中文文档(v1.0.0)
- 【PMP】项目生命周期和开发生命周期
- LeetCode #003# Longest Substring Without Repeating Characters(js描述)
- spring boot 添加客户端负载均衡
热门文章
- (转)使用Apache的ab工具进行压力测试
- angularJS和requireJS和angularAMD
- 2008年最佳Web设计/前端开发技巧、脚本及资源总结
- jsonArray转换成List
- 在线文库解决方案Jacob+SwfTools+FlexPaper
- [转]关于Repository模式
- XSS攻击原理
- Python学习笔记(三)——文件系统中的常用方法
- Unable to resolve dependency for &#39;:app@debug/compileClasspath&#39;: Could not resolve com.android.support:appcompat-v7:26.1.0
- day25 模块,sys, logging, json, pickle