CF185D

转载

题意

(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/CHK666/p/15549783.html