BZOJ3122 [Sdoi2013]随机数生成器 数论
来源:互联网 发布:slx64c 网络 编辑:程序博客网 时间:2024/06/06 19:50
题意:对于递推式X_{i}=(a*X_{i-1}+b)%p | X_{1}=c 求最小的n满足X_{n}=t 其中a,b,c,t,p为给定非负整数且p为质数,0<=a<=p-1,0<=b<=p-1,2<=p<=10^9
Sol:
把递推式展开得 X_{n}=x1*a^(n-1)+(a^(n-1)+a^(n-2)...a^0)*b
括号里是等比数列,根据求和公式得 X_{n}=x1*a^(n-1)+b*(1-a^(n-1))/(1-a)=a^(n-1)+b*(a^(n-1)-1)/(a-1)=t
左右同乘(a-1) -> 拆括号+合并同类项得a^(n-1)=(t*(a-1)+b)/(x1*(a-1)+b)
模意义下除法,用逆元搞
然后转化成已知a^(n-1)求n,离散对数问题,用BSGS做
最后注意下上边的式子中分母不能是0,特判a=1
此外还要特判t==x1 、a=0 、a=0&&b=1 等情况
Code:
#include<bits/stdc++.h>#define debug(x) cout<<#x<<"="<<x<<endltypedef long long ll;using namespace std;ll p,a,b,x1,tar;int T;map<ll,int> M;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}ll PowerMod(ll x,ll y,ll mod){ x%=mod;ll res=1; while(y) { if(y&1) res=(res*x)%mod; x=(x*x)%mod;y>>=1; }return res;}int bsgs(ll x,ll y) // x ^ res = y{M.clear();int mr=ceil(sqrt(p));ll num=y,base=PowerMod(x,mr,p);for(int i=0;i<=mr;i++){M[num]=i;num=num*x%p;}num=base;for(int i=1;i<=mr;i++){if(M.count(num)) return i*mr-M[num];num=num*base%p;}return -2;}int main(){T=read();while(T--){p=read();a=read();b=read();x1=read();tar=read();if(tar==x1){puts("1");continue;}if(a==0){printf("%d\n",(tar==b)?2:-1);continue;}if(a==1&&b==0){puts("-1");continue;}if(a==1) printf("%d\n",((tar-x1)*PowerMod(b,p-2,p)%p+p)%p+1);// x1+(n-1)*b=tarelse // (a^(n-1))*x1+b*(a^(n-1)-1)/(a-1)=tar{ll num=(a-1+p)%p,inv=PowerMod((x1*num+b)%p,p-2,p);printf("%d\n",bsgs(a,(tar*num+b)%p*inv%p)+1);}}return 0;}
阅读全文
1 0
- BZOJ3122 [Sdoi2013]随机数生成器 数论
- BZOJ3122: [Sdoi2013]随机数生成器
- bzoj3122 [Sdoi2013]随机数生成器
- bzoj3122【SDOI2013】随机数生成器
- bzoj3122: [Sdoi2013]随机数生成器
- 【bzoj3122】【SDOI2013】 随机数生成器
- 【bzoj3122】[Sdoi2013]随机数生成器 BSGS
- BZOJ3122 && XOJ17 [Sdoi2013]随机数生成器
- 【BZOJ3122】【SDOI2013】随机数生成器(快速幂+BSGS)
- bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)
- BZOJ 3122 SDOI2013 随机数生成器 数论 EXBSGS
- bzoj3122 随机数生成器 BSGS
- 【JZOJ3211】【SDOI2013】随机数生成器
- bzoj3122 随机数生成器 BSGS+费马小定理求逆元
- bzo j3122: [Sdoi2013]随机数生成器
- bzoj 3122 [Sdoi2013]随机数生成器
- 【SDOI2013 R1 Day1】随机数生成器
- [bzoj 3122] [Sdoi2013]随机数生成器:数论,同余,分类讨论,BSGS
- TCP 组包和拆包算法-转载
- 基于dom4j获取、设置xml文件属性值
- Python 3.6 模块学习math库常见函数
- win10解决photoshop打不开问题
- java.util.ConcurrentModificationException 解决办法
- BZOJ3122 [Sdoi2013]随机数生成器 数论
- navbar-default /navbar-brand(logo栏)/navbar-text
- Composer-Windows下的安装问题
- 关于vim在插入模式中Backspace键无法删除的问题[转]
- java设计模式之---工厂模式在开发中的运用
- JAVA 输入流 窗体 文本域 运行系统命令
- RESTful @Controller和@RestController使用
- 使用0x3f3f3f3f表示无穷大
- C/C++ | 27-18 n的无序数组,求排序算法,并且要求时间复杂度为O(n)