又是写了一晚上才过的题…

题意:有一个数列$x_n=(ax_{n-1}+b) mod p$,给你$x_1,a,b,p,t$,求最小的$x_i=t$的$i$,可能不存在


一开始很自然的推出了式子$x_n \equiv a^{n-1}x_1+b*\frac{a^{n-1}-1}{a-1} \pmod p$

这时候如果$a=1$的话就特判一下然后用exgcd做

否则让$x_n=T$得到$a^{n-1}*(ax_1-x_1+b) \equiv (a-1)T+b \pmod p$

如果$ax_1-x_1+b$存在逆元的话就两边乘上逆元然后BSGS做,不存在逆元就无解啦

然后我判a=0的时候当t=b的时候返回了1…然后交上去一直wa还拍不出来

#include<cstdio>
#include<cmath>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lint; inline lint read()
{
lint s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return s*f;
} map<lint,lint>x; inline lint gcd(lint a,lint b)
{
return !b?a:gcd(b,a%b);
} inline lint exgcd(lint a,lint b,lint &x,lint &y)
{
if(b==0)
{
x=1;y=0;
return a;
}lint d=exgcd(b,a%b,x,y);
lint tx,ty;tx=y;ty=x-a/b*y;
x=tx;y=ty;
return d;
} inline lint mul_mod(lint a,lint b,lint p)
{
lint res=a%p*b%p;res=(res%p+p)%p;return res;
} inline lint pow_mod(lint a,lint b,lint p)
{
lint res=1;
for(;b;b>>=1,a=(a*a)%p)if(b&1)res=(res*a)%p;
return res;
} inline lint inv(lint a,lint p)
{
return mul_mod(pow_mod(a,p-2,p),1,p);
} inline lint BSGS(lint a,lint b,lint p)
{
a%=p;x.clear();
if(a==0&&b==0)return 1;
if(a==0)return -1;
lint m=ceil(sqrt(p)),t=1;
x[1]=m+1;
for(register lint i=1;i<m;i++)
{
t=mul_mod(t,a,p);
if(!x[t])x[t]=i;
}
lint tmp=pow_mod(a,p-1-m,p),inv=1;
for(register lint k=0;k<m;k++)
{
lint i=x[b*inv%p];
if(i)
{
if(i==m+1)i=0;
return k*m+i;
}
inv=mul_mod(inv,tmp,p);
}
return -1;
} inline lint solve(lint p,lint a,lint b,lint x,lint t)
{
if(x%p==t%p)return 1;
if(a==0)
{
if(b%p==t%p)return 2;//before this is return 1; T_T
return -1;
}
if(a==1)
{
lint k,l,c,tmp;c=((t-x)%p+p)%p;
tmp=gcd(b,p);
if(c%tmp)return -1;
c/=tmp;
exgcd(b,p,k,l);
k=k*c%p;
k=(k%p+p)%p;
return k+1;
}
lint q=(x*a%p-x+b)%p;q=(q+p)%p;
if(gcd(q,p)!=1)return -1;
lint tmp=((a-1)*t+b)%p*inv(q,p);tmp=mul_mod(tmp,1,p);
lint res=BSGS(a,tmp,p);
if(res==-1)return -1;
return ((res%p)+p)%p+1;
} int main()
{
lint t=read();
while(t--)
{
lint p,a,b,x,T;
p=read();a=read();b=read();x=read();T=read();
printf("%lld\n",solve(p,a,b,x,T));
}
return 0;
}

最新文章

  1. [Modern OpenGL系列(三)]用OpenGL绘制一个三角形
  2. TFS二次开发系列:五、工作项查询
  3. nodeJS中exports和mopdule.exports的区别
  4. 转:XBMC源代码分析
  5. git 使用笔记(二)
  6. Counting Bits
  7. shell软件工具设计的原则_转
  8. 跨平台c++ Coroutine,仿unity3d实现
  9. Delphi初学者应小心的六大陷阱
  10. Internet Explorer for Mac the Easy Way: Run IE 7, IE8, &amp; IE9 Free in a Virtual Machine
  11. html5画图和本地存储
  12. bootstrop之模态框关闭
  13. .NET技术+25台服务器怎样支撑世界第54大网站
  14. 【Python】Talk Python To Me Podcast播客
  15. BAT (中国互联网公司三巨头)
  16. Vue 限制input输入 限数字 或 小数点后两位number
  17. H5的Page Visibility API
  18. nginx防DOS攻击
  19. WPF 颜色渐变
  20. rvm 安装ruby环境报错curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

热门文章

  1. Camtasia处理音频制作BGM
  2. FL Studio进行侧链的三种方式(上)
  3. [NOIP2013][LGOJ P1967]货车运输
  4. 使用Python切片赋值
  5. mq TransientStorePool
  6. [BUGCASE]Webpack打包报JavaScript堆内存泄漏的错误
  7. VC与VB
  8. LeetCode 023 Merge k Sorted Lists
  9. web 应用、 框架 及HTTP协议
  10. Mysql主从同步机制