【BZOJ3122】【SDOI2013】随机数生成器(快速幂+BSGS)
来源:互联网 发布:java springmvc 分页 编辑:程序博客网 时间:2024/06/05 02:52
题目描述
传送门
题解
先说一下暴力的写法,这道题最好是写一个小暴力拍一下:
按照题目描述的枚举即可,但是要注意判断无解的条件。通过观察可以发现这个数列是存在循环节的,如果已经找到了循环节并且第一个循环节内没有满足条件的
正解的话应该是把这个式子变一下形然后做BSGS,推倒如下:
原式可以化为:
则
讲②代人①得到
很神奇啊对不对,迭代下去
于是我们可以得到:
我们发现,除了
其中inv为某数的逆元。
用BSGS算法求n-1即可
需要注意的一些小问题:
①在同余式中除以一个数等于乘以这个数的逆元。在模p意义下a的逆元为
②因为满足0<=a,b,x1<=p-1,且p为质数,那么一定满足a-1和p互质,那么我们就可以用快速幂求a-1的逆元啦。
③一些特殊情况需要特判
代码
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<map>using namespace std;#define LL long longLL T,P,a,b,x1,t;LL ny1,ny2,val1,val2,val3;LL ans;map <LL,LL> hash;inline LL fast_pow(LL a,LL p){ LL ans=1; for (;p;p>>=1,a=a*a%P) if (p&1) ans=ans*a%P; return ans;}inline LL BSGS(LL a,LL b){ LL m=ceil(sqrt(P)); LL a_m=fast_pow(a,m); hash.clear(); LL mul=1; LL val=mul*b%P; hash[val]=0; for (LL j=1;j<=m;++j){ mul=mul*a%P; val=mul*b%P; hash[val]=j; } mul=1; for (LL i=1;i<=m;++i){ mul=mul*a_m%P; if (hash[mul]){ LL x=i*m-hash[mul]; return x+1; } } return -1;}int main(){ scanf("%lld",&T); while (T--){ scanf("%lld%lld%lld%lld%lld",&P,&a,&b,&x1,&t); //一坨特判 if (t==x1){ printf("1\n"); continue; } if (a==0){ if (t==b) printf("2\n"); else printf("-1\n"); continue; } if (a==1&&b==0){ printf("-1\n"); continue; } if (a==1){ int nyb=fast_pow(b,P-2); ans=((((t-x1)%P+P)%P)*nyb%P)%P; printf("%lld\n",ans+1); continue; } ny1=fast_pow(a-1,P-2); val1=b*ny1%P; val2=(x1%P+val1)%P; ny2=fast_pow(val2,P-2); val3=(t+val1)%P; b=(val3*ny2)%P; ans=BSGS(a,b); printf("%lld\n",ans); }}
总结
①注意负数的情况。
②先%后+还是先+后%想清楚。在纸上列列公式,实在不行先换元。
③在%p意义下a的逆元为
④其实这道题是在式子的两边同时加上了一个常数,然后化成通项公式。也就是找出
0 0
- 【BZOJ3122】【SDOI2013】随机数生成器(快速幂+BSGS)
- 【bzoj3122】[Sdoi2013]随机数生成器 BSGS
- bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)
- bzoj3122 随机数生成器 BSGS
- BZOJ3122: [Sdoi2013]随机数生成器
- bzoj3122 [Sdoi2013]随机数生成器
- bzoj3122【SDOI2013】随机数生成器
- bzoj3122: [Sdoi2013]随机数生成器
- 【bzoj3122】【SDOI2013】 随机数生成器
- BZOJ3122 && XOJ17 [Sdoi2013]随机数生成器
- BZOJ3122 [Sdoi2013]随机数生成器 数论
- bzoj3122 随机数生成器 BSGS+费马小定理求逆元
- BZOJ-3122-随机数生成器-SDOI2013-BSGS
- BZOJ 3122 [Sdoi2013]随机数生成器 BSGS
- BZOJ 3122: [Sdoi2013]随机数生成器 ex_gcd+BSGS
- Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
- bzoj 3122 随机数生成器 (BSGS)
- 【JZOJ3211】【SDOI2013】随机数生成器
- win8.1系统中Sybase PowerBuilder已停止工作的有效解决办法
- mysql 常见错误:Can't create table... errno150原因分析
- PAT-A1009 Product of Polynomials (25)(模拟)
- Mac的MySQL无法启动的原因
- 基数排序
- 【BZOJ3122】【SDOI2013】随机数生成器(快速幂+BSGS)
- [GDKOI2016]不稳定的传送门
- Search a 2D Matrix
- 详解MapReduce过程
- 集合无序性的体验
- 二叉树的递归遍历(dp)
- POJ 2955 Brackets 区间DP 入门
- git比较远程和本地
- spring动态数据源配置以及以及利用AOP自动设置