正题

题目链接:https://www.luogu.com.cn/problem/P3306


题目大意

给出一个\(p,a,b,x_1,t\),有\(x_i=ax_{i-1}+b\)

求一个最小的\(n\)使得\(x_n=t\)


解题思路

下标缩一下先变成\(x_0\)会更好算一点,只考虑\(x_0\)的贡献就是\(x_0\times a^n\),这个比较好搞。

\(b\)的贡献的话,对于第\(i\)次加入的\(b\)贡献是\(a^{n-i}\)总共也就是\(b\times \sum_{i=0}^{n-1}a^i\)

通项公式一下合起来就是

\[x_0a^n+\frac{a^n-1}{a-1}b=t
\]

把\(a^n\)提到前面来就是

\[a^n=\frac{t(a-1)+b}{xa-x+b}
\]

后面那个是已知的,然后就是上\(\text{BSGS}\)就好了。

需要注意的是如果\(a=1\)就不能用通项公式了,得上\(\text{exgcd}\)来搞。

要特判的东西有点多就不多讲了


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
ll T,p,a,b,x,t,ans;
map<ll,ll> v;
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%p;
x=x*x%p;b>>=1;
}
return ans;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1;y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll z=x;x=y;y=z-a/b*y;
return d;
}
void works(ll a,ll b,ll p){
ll x,y;
ll d=exgcd(a,p,x,y);
if(b%d){
printf("-1\n");
return;
}
x*=b/d;y*=b/d;
printf("%lld\n",(x%(d*p)+d*p)%(d*p)+1);
}
ll work(ll a,ll b,ll p){
if(!a&&!b)return 1;
if(!a)return -2;
ll t=sqrt(p)+1;v.clear();
for(ll i=0,z=1;i<t;i++,z=z*a%p)
v[z*b%p]=i;
a=power(a,t);
if(b==1||!a)return 1;
else if(!a)return -2;
ll ans=1e18;
for(ll i=0,tmp=1;i<=t;i++,tmp=tmp*a%p){
ll j=(v.find(tmp)!=v.end())?v[tmp]:-1;
if(j>=0&&i*t-j>=0)ans=min(ans,i*t-j);
}
if(ans==1e18)return -2;
return ans;
}
signed main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x,&t);
if(!a&&!t&&b){puts("-1");continue;}
if(x==t){puts("1");continue;}
if(a==1){
works(b,(t-x+p)%p,p);
continue;
}
t=(t*(a-1)+b)%p;x=(x*a-x+b+p)%p;
t=t*power(x,p-2)%p;t=(t+p)%p;
printf("%lld\n",work(a,t,p)+1);
}
return 0;
}

P3306-[SDOI2013]随机数生成器【BSGS】的更多相关文章

  1. 洛咕 P3306 [SDOI2013]随机数生成器

    洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...

  2. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  3. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  4. 洛谷P3306 [SDOI2013]随机数生成器(BSGS)

    传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...

  5. BZOJ3122: [Sdoi2013]随机数生成器(BSGS)

    题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...

  6. bzoj 3122 : [Sdoi2013]随机数生成器 BSGS

    BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...

  7. 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用

    题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...

  8. [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列

    题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...

  9. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

    Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...

  10. P3306 [SDOI2013]随机数生成器

    思路:\(BSGS\) 提交:\(1\)次 题解: 原式可以化为\[x_{i+1}+\frac{b}{a-1}=a(x_{i}+\frac{b}{a-1})\mod p\] 这不是等比数列吗? \[x ...

随机推荐

  1. Azkaban入门(启动一个Simple Example)

    Azkaban简介 azkaban是一个开源的任务调度系统 Azkaban是一套简单的任务调度服务,整体包括三部分webserver.dbserver.executorserver. 开发语言为Jav ...

  2. 【转】TCP的三次握手与四次挥手理解及面试题

    转自:https://blog.csdn.net/qq_38950316/article/details/81087809 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据 ...

  3. php Abstract 抽象类 与 Interface的

    一.Abstract Class 与 Interface 的构造 抽象类 Abstract Class <?php abstract class A { abstract public func ...

  4. kafka零拷贝机制

    kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不会kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝. 传统IO kafka的数据是要落入磁 ...

  5. Go错误处理正确姿势

    1. panic 在什么情况下使用panic? 在程序启动的时候,如果有强依赖的服务出现故障时panic退出 在程序启动的时候,如果发现有配置明显不符合要求,可以panic退出(预防编程) 其他情况下 ...

  6. 真实机中安装CentOS

    前言 最近在b站上看了兄弟连老师的Linux教程,非常适合入门:https://www.bilibili.com/video/BV1mW411i7Qf 看完后就自己来试着玩下,正好手上有台空闲的电脑就 ...

  7. 【Tools】Anaconda Operaction

    专为数据科学和机器学习工作流程而设计,是一个开源包管理器,环境管理器,以及Python和R编程语言的分发.它通常用于大规模数据处理,科学计算和预测分析.pip install xxx ,在特定环境里使 ...

  8. C# - 习题02_写出程序的输出结果a.Fun()

    时间:2017-08-23 整理:byzqy 题目:写出程序的输出结果: 文件:Program.cs 1 using System; 2 3 namespace Interview1 4 { 5 pu ...

  9. struts框架返回json数据

    设置返回result类型为json格式 <package name="cn.konngo.action" namespace="/" extends=&q ...

  10. rsync 服务搭建

    rsync 服务搭建 服务端部署操作内容: 创建rsync用户和用户组 eg: useradd -s /sbin/nologin -M rsync 创建需要备份的指定目录,并修改权限 eg: mkdi ...