bzoj 3122 : [Sdoi2013]随机数生成器 BSGS
BSGS算法
转自:http://blog.csdn.net/clove_unique
问题
给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$
题解
这就是经典的BSGS算法,方法如下:
令$x=im−j$,$m=⌈\sqrt{p}⌉$,则$a^{im−j}≡b(mod \ p)$
移项,得$(a^m)^i≡ba^j(mod \ p) $
首先,从$0−m$枚举$j$,将得到的$ba^j$的值存入hash表;
然后,从$1−m$枚举$i$,计算$(a^m)^i$,查表,如果有值与之相等,则当时得到的$im−j$是最小值。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<map>
- #include<cmath>
- #define int long long
- using namespace std;
- int p;
- int pw(int x,int y)
- {
- int lst=;
- while(y)
- {
- if(y&)lst=lst*x%p;
- y>>=;
- x=x*x%p;
- }
- return lst;
- }
- int xx,yy;
- void exgcd(int a,int b)
- {
- if(b==)
- {
- xx=;yy=;
- return ;
- }
- exgcd(b,a%b);
- int tmp=xx;
- xx=yy;
- yy=tmp-(a/b)*yy;
- return ;
- }
- map<int,int>mp;
- int work(int a,int b)
- {
- int m=ceil(sqrt(p));
- mp.clear();
- int now=;
- mp[now*b%p]=;
- for(int i=;i<=m;i++)
- {
- now=now*a%p;
- mp[now*b%p]=i;
- }
- int tmp=;
- for(int i=;i<=m;i++)
- {
- tmp=tmp*now%p;
- if(mp[tmp])
- {
- return i*m-mp[tmp];
- }
- }
- return -;
- }
- int a,b,x1,t;
- signed main()
- {
- int cas;
- scanf("%lld",&cas);
- while(cas--)
- {
- scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t);
- if(x1==t)
- {
- puts("");
- continue;
- }
- if(a==)
- {
- if(x1==t)puts("");
- else if(b==t)puts("");
- else puts("-1");
- continue;
- }
- if(a==)
- {
- if(!b)
- {
- if(x1==t)puts("");
- else puts("-1");
- continue;
- }
- exgcd(b,p);
- int tmp=(t-x1+p)%p;
- xx=((xx*tmp%p)+p)%p;
- xx++;
- printf("%lld\n",xx);
- }
- else
- {
- int c=pw(a-,p-);
- int t1=(x1+b*c)%p,t2=p,t3=(b*c+t)%p;
- exgcd(t1,t2);
- xx=(xx%p+p)%p;
- xx=(xx*t3)%p;
- int ans=work(a,xx);
- if(ans!=-)printf("%lld\n",ans+);
- else printf("%lld\n",ans);
- }
- }
- return ;
- }
bzoj 3122 : [Sdoi2013]随机数生成器 BSGS的更多相关文章
- Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...
- bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
- bzoj 3122: [Sdoi2013]随机数生成器【BSGS】
题目要求的是: \[ ...a(a(a(ax+b)+b)+b)+b...=a^nx+a^{n-1}b+a^{n-2}b+...+b\equiv t(mod\ p) \] 后面这一大坨看着不舒服,所以考 ...
- bzoj 3122: [Sdoi2013]随机数生成器
#include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...
- 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用
题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...
- [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列
题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...
随机推荐
- hadoop最新稳定版本使用建议
Apache Hadoop Apache版本衍化比较快,我给大家介绍一下过程 ApacheHadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop ...
- 新手Python第四天(生成器)
Python 生成器 生成器和生成表达式 a=[i*2 for i in range(10)]#生成表达式 b=(i*2 for i in range(10))#生成器 生成器的特点:优点(不占用内存 ...
- layui数据表格使用(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)
表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table.layui table ...
- Java时间格式的使用,bug难时真是坑
很简单的问题,尤其是新手开发,要多自己动手写代码,都说程序猿大都是程序的搬用工,其实不然,好的写手,和差的写手,区别就在是不是会花时间读读代码,并且自己动手实践一下,其实一个程序范这样的错误,绝对是低 ...
- Mongodb For Mac OSX && 登录验证
题外话:尽管有不少人贴出了 <我不用mongodb的十大理由> 等系列文章,但是 NoSQL 的发展不会因此而止步, mongodb 是 NoSQL 的典型代表,楼主还是抱乐观态度的,有人 ...
- Thirteenth scrum meeting 2015/11/11
发布bug整理集结: 手机用户体验优化优化: (1)主界面和课程界面的字体规格以及界面结构不同 (2)课程图片的大小格式不统一,造成美观下降 ( 3 )按钮的位置不美观 平板用户体验: (1)Tab键 ...
- [2017BUAA软工]结对项目:数独扩展
结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...
- 面向对象程序设计第三次作业-Calculator
题目: 最终代码: Scan.h: Print.h: Calaulator.cpp: 解题过程 看到题目后,在查询之后明白了这是多文件的题目,然后通过翁凯老师的视频讲解知道了.h和.cpp文件的区别和 ...
- 深入理解JAVA I/O系列三:字符流详解
字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节 ...
- ABP ModuleZero后台框架materialize禁止模拟select和checkbox
使用abp modulezero自带那个后台框架发现一个操蛋的问题,所有的select和checkbox都被改成div模拟的,虽然比原生美观,但有时候真的很难用. 比如说要用select做一个联动菜单 ...