如果K为偶数,任意两个数互质
如果K为奇数,任意两个数gcd==2
然后算 乘积
然后算 和 等比数列
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef __int64 LL;
LL _pow(LL a,LL b,LL mod){
LL c=1;a%=mod;
while(b){
if(b&1){
c*=a;c%=mod;
}
a*=a;a%=mod;b/=2;
}
return c;
}
LL K,L,R,P;
LL fun(LL n){
if(K%P==0)return 1;
LL y=_pow(2LL,n,P-1);
LL x=_pow(K,_pow(2LL,n,P-1),P);
return (x-1+P)%P;
}
LL rev(LL a){
return _pow(a,P-2,P);
}
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
int T;scanf("%d",&T);
while(T--){
scanf("%I64d%I64d%I64d%I64d",&K,&L,&R,&P);
if(P==2){
printf("%d\n",K%2?0:1);
}
else {
LL ans=fun(L);
if(ans){
ans=fun(R+1)*rev(ans)%P;
}
else {
ans=_pow(2LL,R-L+1,P);
}
if(K%2){
ans*=rev(_pow(2LL,R-L,P));
ans%=P;
}
printf("%I64d\n",ans);
}
}
return 0;
}