题目传送门

前置知识

大步小步算法

解法

  • 递推式为 \(x_{n}=(ax_{n-1}+b) \bmod p\),发现可以统一消去 \(\bmod p\) ,只在最后参与计算。以下过程省去模运算。
  • 当 \(x_{0}=t\) 时,则 \(n=0\) 即为所求。
  • 当 \(a=0,x_{0} \ne t\) 时,递推式转化为 \(x_{n}=b \bmod p\) 。若 \(b=t\) ,则 \(n=1\) 即为所求;否则无解。
  • 当 \(a \ne 0,x_{0} \ne t\) 时,设 \(x_{n}+c=a(x_{n-1}+c)\) 。
    • 当 \(a=1\) 时,递推式转化为 \(\begin{aligned} x_{n}&=x_{n-1}+b \\ &=x_{n-2}+2b \\ &=x_{n-3}+3b \\ &= \dots \\ &=x_{0}+nb \end{aligned}\),将 \(x_{n}=t\) 代入得 \(t=(x_{0}+nb) \bmod p\),移项得 \(nb \equiv (t-x_{0}) \pmod {p}\)。当 \(\gcd(b,p)|(t-x_{0})\) 时,移项得 \(n \equiv \dfrac{t-x_{0}}{b} \pmod {p}\),解得 \(n \equiv \dfrac{t-x_{0}}{b} \pmod {p}\);否则无解。
    • 当 \(a \ne 1\) 时,解得 \(c=\dfrac{b}{a-1}\) 并和 \(x_{n}=t\) 一起代入原式得 \(\begin{aligned} t+\dfrac{b}{a-1}&=a(x_{n-1}+\dfrac{b}{a-1}) \\ &=a^{2}(x_{n-2}+\dfrac{b}{a-1}) \\ &=a^{3}(x_{n-3}+\dfrac{b}{a-1}) \\ &= \dots \\ &=a^{n}(x_{0}+\dfrac{b}{a-1}) \end{aligned}\) 。当 \(\gcd(x_{0}+\dfrac{b}{a-1},p)|(t+\dfrac{b}{a-1})\) 时,移项得 \(a^{n} \equiv \dfrac{t+\dfrac{b}{a-1}}{x_{0}+\dfrac{b}{a-1}} \pmod {p}\) ,跑遍 BSGS 求解即可;否则无解。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
ll qpow(ll a,ll b,ll p)
{
ll ans=1;
while(b>0)
{
if(b&1)
{
ans=ans*a%p;
}
b>>=1;
a=a*a%p;
}
return ans;
}
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll bsgs(ll a,ll b,ll p)
{
if(1%p==b%p)
{
return 0;
}
else
{
map<ll,ll>vis;
ll k=sqrt(p)+1,i,sum;
for(i=0;i<=k-1;i++)
{
vis[b*qpow(a,i,p)%p]=i;
}
a=qpow(a,k,p);
for(i=0;i<=k;i++)
{
sum=qpow(a,i,p);
if(vis.find(sum)!=vis.end())
{
if(i*k-vis[sum]>=0)
{
return i*k-vis[sum];
}
}
}
return -1;
}
}
int main()
{
ll t,p,a,b,x0,day,ans,sum,i;
cin>>t;
for(i=1;i<=t;i++)
{
cin>>p>>a>>b>>x0>>day;
if(x0==day)
{
cout<<0<<endl;
}
else
{
if(a==0)
{
cout<<((b==day)?1:-1)<<endl;
}
else
{
if(a==1)
{
if((day-x0)%gcd(b,p)==0)
{
cout<<qpow(b,p-2,p)*(day-x0+p)%p<<endl;
}
else
{
cout<<-1<<endl;
}
}
else
{
sum=qpow(a-1,p-2,p)*b%p;
if((day+sum)%gcd(x0+sum,p)==0)
{
ans=bsgs(a,((day+sum)%p)*qpow(x0+sum,p-2,p)%p,p);
cout<<ans<<endl;
}
else
{
cout<<-1<<endl;
}
}
}
}
}
return 0;
}

后记

多倍经验:P3306 | Gym103486C

AT_abc270_g [ABC270G] Sequence in mod P 题解的更多相关文章

  1. HDU1560 DNA sequence(IDA*)题解

    DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  2. 51NOD 1038:X^A Mod P——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1038 X^A mod P = B,其中P为质数.给出P和A B,求< ...

  3. 递推:Number Sequence(mod找规律)

    解题心得: 1.对于数据很大,很可怕,不可能用常规手段算出最后的值在进行mod的时候,可以思考找规律. 2.找规律时不必用手算(我傻,用手算了好久).直接先找前100项进行mod打一个表出来,直接看就 ...

  4. Hdoj 2454.Degree Sequence of Graph G 题解

    Problem Description Wang Haiyang is a strong and optimistic Chinese youngster. Although born and bro ...

  5. hdu 6299 Balanced Sequence(贪心)题解

    题意:题意一开始不是很明白...就是他给你n个串,让你重新排列组合这n个串(每个串内部顺序不变),使得匹配的括号长度最大.注意,题目要求not necessary continuous,括号匹配不需要 ...

  6. [CF-GYM]Abu Tahun Mod problem题解

    前言 这道题比较简单,但我还是想了好一会 题意简述 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组\(\left\{1\right\},\left ...

  7. [题解] Atcoder Beginner Contest ABC 270 G Ex 题解

    点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...

  8. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

  9. CodeForcesGym 100735B Retrospective Sequence

    Retrospective Sequence Time Limit: Unknown ms Memory Limit: 65536KB This problem will be judged on C ...

  10. 题解【洛谷P1347】排序

    题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列\(A,B,C,D\) 表示\(A<B,B<C,C<D\).在这道题中,我们将给你一系列 ...

随机推荐

  1. longjmp 使 C++ RAII 失效

    C 语言的 longjmp 没有进行栈展开,而是直接跳转.从 longjmp 到 setjmp 之间的所有析构函数都没有调用,也就是 RAII 失效. #include <setjmp.h> ...

  2. Go 疑难杂症汇总

    1. revision v0.0.0: unknown revision v0.0.0 go get -u github.com/uudashr/gopkgs/cmd/gopkgs 报错: [root ...

  3. ReentrantLock 可重入锁总结

    本文为博主原创,未经允许不得转载: ReentrantLock 是一种内置锁,也叫可重入锁(ReentrantLock),它允许线程再次获取已持有的同步锁,这样防止死锁的发生.在使用Reentrant ...

  4. gitee 创建代码仓库,并提交本地代码

    本文为博主原创,转载请注明出处: 1. 配置本地 gitee 的配置: git config --global user.name "xiangBaxiang" git confi ...

  5. 使用XStream,XMLSerializer 解析及格式转换

    博主原创,转载请注明出处 1.引入对应的maven依赖: <!--xstream--> <dependency> <groupId>com.thoughtworks ...

  6. [转帖]060-轻量级基于curl的seafile上传脚本

    https://anjia0532.github.io/2021/04/07/seafile-client-curl/ 这是坚持技术写作计划(含翻译)的第 60 篇,定个小目标 999,每周最少 2 ...

  7. [转帖]Jmeter性能测试:高并发分布式性能测试

    一.为什么要进行分布式性能测试 当进行高并发性能测试的时候,受限于Jmeter工具本身和电脑硬件的原因,无法满足我们对大并发性能测试的要求.基于这种场景下,我们就需要采用分布式的方式来实现我们高并发的 ...

  8. [转帖]一个轻量的Linux运维监控脚本

    https://zhuanlan.zhihu.com/p/472040635 写在前面 我的需求 嗯,有几台很老的机器,上面部署的几个很老的应用 我需要每周对机器上的一些内存,磁盘,线程,应用和数据库 ...

  9. Ergonomics JVM 的一种FullGC的说明

    https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html 2 Ergonomics Ergo ...

  10. [转帖]用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

    https://www.zhihu.com/people/javajia-gou-ji-zhu-44/posts   JDK命令行工具 在JDK的开发包中,除了大家熟知的java.exe和javac. ...