AT_abc270_g [ABC270G] Sequence in mod P 题解
前置知识
解法
- 递推式为 \(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 题解的更多相关文章
- HDU1560 DNA sequence(IDA*)题解
DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 51NOD 1038:X^A Mod P——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1038 X^A mod P = B,其中P为质数.给出P和A B,求< ...
- 递推:Number Sequence(mod找规律)
解题心得: 1.对于数据很大,很可怕,不可能用常规手段算出最后的值在进行mod的时候,可以思考找规律. 2.找规律时不必用手算(我傻,用手算了好久).直接先找前100项进行mod打一个表出来,直接看就 ...
- Hdoj 2454.Degree Sequence of Graph G 题解
Problem Description Wang Haiyang is a strong and optimistic Chinese youngster. Although born and bro ...
- hdu 6299 Balanced Sequence(贪心)题解
题意:题意一开始不是很明白...就是他给你n个串,让你重新排列组合这n个串(每个串内部顺序不变),使得匹配的括号长度最大.注意,题目要求not necessary continuous,括号匹配不需要 ...
- [CF-GYM]Abu Tahun Mod problem题解
前言 这道题比较简单,但我还是想了好一会 题意简述 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组\(\left\{1\right\},\left ...
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- 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 题解 直接 ...
- CodeForcesGym 100735B Retrospective Sequence
Retrospective Sequence Time Limit: Unknown ms Memory Limit: 65536KB This problem will be judged on C ...
- 题解【洛谷P1347】排序
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列\(A,B,C,D\) 表示\(A<B,B<C,C<D\).在这道题中,我们将给你一系列 ...
随机推荐
- 开源项目《Elight.MVC-ASP.NET》的研究学习
一 观看效果 将源码下载来后,发现不能直接运行,读了一下md文件,发现还要做自己一些改动. 由于我本机是sqlserver, 所以我改了下 appsetting.json 里要使用的数据库,然后 ...
- zzuli 1023
java 读入单个字符 import java.util.Scanner; public class Main{ public static void main(String args[]){ Sca ...
- 大数相加 a+b
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #i ...
- tomcat 一闪而过 ( 解决方案 )
配置JAVA_HOME,注意变量值是jdk的主目录,不是bin目录,并且不要加分号
- [转帖]nginx优化配置及方法论
https://www.jianshu.com/p/87f8c03e91bd 1.优化方法论 从软件层面提升硬件使用效率 增大CPU的利用率 增大内存的利用率 增大磁盘IO的利用率 增大网络带宽的利用 ...
- [转帖]Linux内核参数 rp_filter
https://www.cnblogs.com/chenmh/p/6001977.html 简介 rp_filter (Reverse Path Filtering)参数定义了网卡对接收到的数据包进行 ...
- [转帖]ramdisk三种实现方式
https://www.jianshu.com/p/c14cee74fa0a Ramdisk/ramfs/tmpfs Ramdisk:大小固定,默认4096k.在编译内核的时候需将block devi ...
- [转帖]linux 部署jmeter&报错处理
一.linux 安装jdk Java Downloads | Oracle 二. linux上传jmeter 2.1 上传jmeter jmeter 下载地址: Apache JMeter - Dow ...
- [转帖]FIO – IO压力测试工具
https://blog.csdn.net/younger_china/article/details/71129541 <存储工具系列文章>主要介绍存储相关的测试和调试工具,包括不限于d ...
- vscode推荐插件
js相关的插件 JavaScript (ES6) code snippets Babel ES6/ES7 html css 汉化 Chinese (Simplified) (简体中文) Languag ...