我们发现
其中f 为斐波那契函数 , 可以用矩阵乘法求出来
然后exgcd解方程 , 每隔p/gcd 个就有一个解 , 所以答案就是
如果不大于0后面一坨就是0了
#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct Matrix{
LL x[3][3];
Matrix(){memset(x,0,sizeof(x));}
};
LL X,l,r,k,p,m,T;
LL x,y,gcd;
void exgcd(LL a,LL b){
if(!b){gcd=a , x=1 , y=0; return;}
exgcd(b,a%b);
LL x1=y , y1=x-a/b*y;
x=x1 , y=y1;
}
Matrix mul(Matrix a,Matrix b){
Matrix c;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
c.x[i][j] = (c.x[i][j] + a.x[i][k] * b.x[k][j]) % p;
return c;
}
Matrix power(Matrix a,LL k){
Matrix ans; ans.x[1][1] = ans.x[2][2] = 1;
for(;k;k>>=1){
if(k&1) ans = mul(ans,a);
a = mul(a,a);
}return ans;
}
LL calc(LL A,LL B){if(A<0) return 0;return A/B+1;}
int main(){
cin>>T; while(T--){
cin>>X>>l>>r>>k>>p>>m;
X%=p,m%=p;
Matrix A,B;
A.x[1][1]=A.x[1][2]=1;
B.x[1][1]=B.x[1][2]=B.x[2][1]=1;
B = power(B,k-3); A = mul(A,B);
LL f1 = A.x[1][1] , f2 = A.x[1][2];
LL Now = (f2*X)%p; exgcd(f1,p); x = (x+p) % p;
m -= Now; m = (m+p) % p;
if(m % gcd){printf("0\n"); continue;}
x *= m/gcd; x %= p;
printf("%lld\n",calc(r-x,p/gcd)-calc(l-x-1,p/gcd));
}
}