P4902 乘积 题解
乘积
给出
包含
解
下面叙述暂时不考虑取模,计算时取模即可。
转化为求:
设
则答案为:
现在考虑求解
变式,得到:
令
则
先考虑解决
有:
先来考虑求解
故:
故我们可以
再有求
有:
如果我们知道
直接看,貌似不咋能做,再来考虑设
则有:
同样的,也只有
故
事实上,由于递推求
最后对于一组询问
最后真诚提示:十年OI一场空,不卡常数见祖宗。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 1000500
#define p 19260817
#define ll long long
#define re register
inline int read(){
register int x=0;register char ch=getchar();
while(ch>'9'||ch<'0')ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
int h[N],g[N],A[N],B[N],Ans[N],f[N];
int n,m,t,d[N];
inline void init1(){//预处理出d,h,不影响复杂度的情况下,食用代码较简单的倍数法
for(re int i=1;i<=N-500;i++)h[i]=1;
for(re int i=1;i<=N-500;i++){
for(re int j=i;j<=N-500;j+=i){
h[j]=1ll*h[j]*i%p;
d[j]++;
}
}
}
inline void init2(){//预处理f,g
g[0]=1,f[0]=0;
for(re int i=1;i<=N-500;i++)f[i]=1ll*(f[i-1]+d[i])%p,g[i]=1ll*g[i-1]*h[i]%p;
}
inline int power(int a,int b){
re int ans=1;
while(b){
if(b&1)ans=1ll*ans*a%p;
a=1ll*a*a%p;
b>>=1;
}
return ans;
}
inline void init3(){//预处理A,B,Ans
A[0]=B[0]=1;
for(re int i=1;i<=N-500;i++)A[i]=1ll*A[i-1]*power(i,f[i])%p,B[i]=1ll*B[i-1]*g[i]%p;
for(re int i=0;i<=N-500;i++)Ans[i]=1ll*A[i]*power(B[i],p-2)%p;
}
inline int get(int l,int r){
return 1ll*Ans[r]*power(Ans[l-1],p-2)%p;
}
void init(){
init1();
init2();
init3();
}
signed main(){
t=read();
init();
while(t--){
n=read(),m=read();
printf("%d\n",get(n,m));
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!