CF185D Visit of the Great 解题报告

CF185D Visit of the Great解题报告:

更好的阅读体验

题意

(T) 组询问,每次给定 (k,l,r,p),求 ( ext{lcm}(k^{2^l}+1,k^{2^{l+1}}+1,cdots,k^{2^r}+1)mod p)

(1leqslant Tleqslant 10^5,1leqslant kleqslant 10^6,0leqslant lleqslant rleqslant 10^{18},2leqslant pleqslant 10^9),保证 (p) 是质数。

分析

小清新数论题。

我们简单猜个结论,任意两个数的 (gcd) 都不会很大。取任意两个位置 (a,b(a<b)),设 (gcd(k^{2^a}+1,k^{2^b}+1)=d)

[k^{2^a}equiv k^{2^b}equiv -1pmod d\1equiv(-1)^{2^{b-a}}equiv (k^{2^{a}})^{2^{b-a}}equiv k^{2^b}equiv -1pmod d ]

于是 (d=1)(2),且 (d=2) 当且仅当 (k) 为奇数。

(t=prod_{i=l}^r(k^{2^t}+1)),那么答案就是:

[egin{cases}frac{t}{2^{r-l}}&kequiv1pmod 2\t&kequiv 0pmod 2end{cases} ]

那么我们转求 (t) 的值,考虑直接推式子:

[(k^{2^l}+1)((k^{2^l})^2+1)((k^{2^l})^4+1)cdots((k^{2^l})^{2^{r-l}}+1)\=sum_{p=0}^{2^{r-l+1}-1}(k^{2^l})^p=frac{(k^{2^l})^{2^{r-l+1}}-1}{k^{2^l}-1}=frac{k^{2^{r+1}}-1}{k^{2^l}-1} ]

然后直接算就好了,注意特判 (k^{2^l}equiv 1pmod p) 的情况,此时上式的值为:

[(1+1)(1^2+1)(1^4+1)cdots(1^{2^{r-l}}+1)=2^{r-l+1} ]

代码

#include<stdio.h>
int T,k,p;
long long l,r;
int ksm(int a,long long b,int mod){
	int res=1;
	while(b){
		if(b&1)
			res=1ll*res*a%mod;
		a=1ll*a*a%mod,b>>=1;
	}
	return res;
}
int f(long long x){
	return k%p==0? 0:ksm(k,ksm(2,x,p-1),p);
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%lld%lld%d",&k,&l,&r,&p);
		if(p==2)
			printf("%d
",(k&1)^1);
		else{
			int ans=(f(l)==1? ksm(2,r-l+1,p):(1ll*(f(r+1)-1+p)%p*ksm((f(l)-1+p)%p,p-2,p)%p));
			if(k&1)
				ans=1ll*ans*ksm(ksm(2,r-l,p),p-2,p)%p;
			printf("%d
",ans);
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/xiaoziyao/p/15237270.html