P4902 乘积 题解

乘积

给出A,B,求下面的式子的值.

i=ABj=1i(ij)ij (mod 19260817)

包含T组询问.
T106,AB106

下面叙述暂时不考虑取模,计算时取模即可。
转化为求:

Ans(n)=i=1nj=1i(ij)ij

则答案为:Ans(B)×Ans(A1)1

现在考虑求解Ans(n)
变式,得到:

Ans(n)=i=1nj=1iiij×(i=1nj=1njij)1

A(n)=i=1nj=1iiij,B(n)=i=1nj=1njij

Ans(n)=A(n)×B(n)1

先考虑解决A

有:A(n)=

i=1nif(i),f(i)=j=1iij

先来考虑求解f

f(n)f(n1)=i=1n(nin1i)

nin1i=1,当且仅当i|n

故:f(n)f(n1)=d(n)

d(n)可以欧拉筛O(n)求出。

故我们可以O(n)递推出f,进而递推求出整个AA(n)=A(n1)×nf(n)),复杂度O(nlog2n),显然f(1)=1

再有求B(n)

有:

B(n)B(n1)=i=1nini=g(n)

如果我们知道g,便可以快速递推B。考虑求解g

直接看,貌似不咋能做,再来考虑设h(n)=g(n)g(n1)

则有:

h(n)=i=1ninin1i

同样的,也只有i|n时,才有nin1i=1。所以h(n)=i|ni。故h(n)也是积性函数,线性筛即可。

B(n)=B(n1)·g(n),而g(n)可以通过h递推求出。

事实上,由于递推求A的过程是O(nlogn)的,故求解h,f的过程完全可以用倍数法,复杂度为O(i=1nni)O(nlogn)

最后对于一组询问Ans[l,r]=Ans(r)·Ans(l1)=A(r)×A(l1)1×B(r)1×B(l1)

最后真诚提示:十年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;
} 
posted @   spdarkle  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示