题意:
给
定
a
,
b
,
m
,
x
0
,
x
,
问
用
x
n
+
1
=
(
a
x
n
+
b
)
%
m
得
到
的
序
列
中
有
无
出
现
x
给定a,b,m,x_0,x,问用x_{n+1} = (ax_n+b) \%m得到的序列中有无出现x
给定a,b,m,x0,x,问用xn+1=(axn+b)%m得到的序列中有无出现x
一
顿
操
作
猛
如
虎
我
们
可
以
推
导
到
一顿操作猛如虎我们可以推导到
一顿操作猛如虎我们可以推导到
a
n
≡
x
+
b
a
−
1
x
0
+
b
a
−
1
(
m
o
d
m
)
a^n \equiv \frac{ x + \frac{b}{a-1} }{ x_0 + \frac{b}{a-1} } ( mod\quad m)
an≡x0+a−1bx+a−1b(modm)
这里就可以用BSGS解决了
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL z,a,x0,x,m,p,b,temp,now,f;
map<LL,LL>ma;
LL quick(LL a,LL b,LL p)
{
LL ans = 1;
while( b )
{
if( b&1 )
{
ans = (ans*a)%p;
}
a = (a*a)%p;
b >>= 1;
}
return ans;
}
void solve()
{
cin>>a>>b>>p>>x0>>x;
if( x==x0 )
{
cout<<"YES";
return ;
}
if( a==0 )
{
if( x==b ) cout<<"YES";
else cout<<"NO";
return ;
}
if( a==1 )
{
if( b==0 )
{
cout<<"NO";
return ;
}
}
z = x*(a-1)+b;z %= p;
m = ceil( sqrt(p) );
now = z%p;
f = quick(a,m,p)%p;
ma[now] = 0;
for(LL i=1;i<=m;i++)
{
now = now*a%p;
ma[now] = i;
}
now = x0*(a-1)+b;
now %= p;
bool pd = false;
for(LL i=1;i<=m;i++)
{
now = (now*f)%p;
if( ma[now] )
{
pd = true;
break;
}
}
if( pd ) cout<<"YES";
else cout<<"NO";
}
int main()
{
solve();
return 0;
}