假设
n=Ap+B(B<p)
n
=
A
p
+
B
(
B
<
p
)
B⋅aAp+B≡b ( mod p )
B
·
a
A
p
+
B
≡
b
(
m
o
d
p
)
B⋅aA+B≡b ( mod p )
B
·
a
A
+
B
≡
b
(
m
o
d
p
)
B⋅aB⋅b−1≡(a−1)A ( mod p )
B
·
a
B
·
b
−
1
≡
(
a
−
1
)
A
(
m
o
d
p
)
然后枚举 B B 就好了。时间复杂度 。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,Ans;
int a,inva,b,p,tot;
int A,B;
int f[1000010];
inline int Pow(int x,int y){
int Ans=1;
for(;y;y>>=1,x=1ll*x*x%p)
if(y&1)Ans=1ll*Ans*x%p;
return Ans;
}
inline ll Calc(int x,int y){
if(y==-1)return 0;
ll r=(n-x)/p;
if(r<tot)return (y<=r);
return (r-y)/tot+1;
}
int main(){
scanf("%d%d%d%I64d",&a,&b,&p,&n);
inva=Pow(a,p-2);
memset(f,-1,sizeof(f));
int t=1;
for(int i=0;;i++){
if(f[t]==-1)f[t]=i;else{
tot=i;
break;
}
t=1ll*t*inva%p;
}
t=Pow(b,p-2);
for(int i=0;i<p&&i<=n;i++,t=1ll*t*a%p){
int tmp=1ll*i*t%p;
Ans+=Calc(i,f[tmp]);
}
cout<<Ans<<endl;
return 0;
}