Description

Input

输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数。  
 
接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据。保证X1和t都是合法的页码。

注意:P一定为质数

Output

共T行,每行一个整数表示他最早读到第t页是哪一天。如果他永远不会读到第t页,输出-1。

Sample Input

3
7 1 1 3 3
7 2 2 2 0
7 2 2 2 1

Sample Output

1
3
-1

HINT

0<=a<=P-1,0<=b<=P-1,2<=P<=10^9

题目大意

  给定一个序列$X$的首项$x_{1}$,序列$X$满足递推关系$x_{n + 1} = (a\cdot x_{n} + b)\mod p$,其中这里的$mod$表示求余数。问序列中哪个数第一次为$t$,或者输出无解。

  显然递推关系对方程不是特别友好,所以考虑求序列的通项。

  由于这里用特征根的方法来求会很繁琐,所以直接展开:

$x_{n} = \left ( a\cdot x_{n - 1} + b \right ) \mod p$

$x_{n} = \left ( a^{2}\cdot x_{n - 2} + ab + b \right ) \mod p$

$x_{n} = \left ( a^{n - 1}\cdot x_{1} + a^{n-2}b + \cdots + ab + b \right ) \mod p$

  用等比数列求和公式得到:

$x_{n} = \left [ a^{n - 1}\cdot x_{1} + \frac{\left (a^{n - 1} - 1  \right )b}{a - 1}\right ] \mod p\ \ \ (a \neq 1)$

$x_{n} = \frac{a^{n - 1}\cdot x_{1}\left ( a - 1 \right ) + \left (a^{n - 1} - 1  \right )b}{a - 1} \mod p\ \ \ (a \neq 1)$

$x_{n} = \frac{a^{n - 1}\cdot\left [ x_{1}\left ( a - 1 \right ) + b  \right ]  - b}{a - 1} \mod p\ \ \ (a \neq 1)$

  然后再移项:

$a^{n - 1}\cdot\left [ x_{1}\left ( a - 1 \right ) + b  \right ] \equiv \left ( a - 1 \right )x_{n} + b \pmod{p}\ \ \ (a \neq 1)$

  BSGS解方程即可。

  继续考虑$a = 1$的情况,此时有:

$x_{n} \equiv x_{1} + \left ( n - 1 \right )b \pmod{p} \ \ \left ( a = 1 \right )$

  写成不定方程的形式:

$n\cdot b + k\cdot p = x_{n}+ b - x_{1}\ \ \left ( a = 1 \right )$

  直接扩欧算答案。

  注意一个细节,扩欧如果算出答案模$p$为0,那么应该输出$p$,因为这里求的是最小正余数。

  似乎$a = 0$的时候,要加点处理,不然扔进去的东西变成负数,BSGS也会出事情。干脆直接特判。

Code

 /**
* bzoj
* Problem#3122
* Accepted
* Time: 268ms
* Memory: 2028k
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef bool boolean; typedef class HashMap {
private:
static const int M = ;
public:
int ce;
int h[M], key[M], val[M], next[M]; HashMap() { } void insert(int k, int v) {
int ha = k % M;
for (int i = h[ha]; ~i; i = next[i])
if (key[i] == k) {
val[i] = v;
return;
}
++ce, key[ce] = k, val[ce] = v, next[ce] = h[ha], h[ha] = ce;
} int operator [] (int k) {
int ha = k % M;
for (int i = h[ha]; ~i; i = next[i])
if (key[i] == k)
return val[i];
return -;
} void clear() {
ce = -;
memset(h, -, sizeof(h));
}
}HashMap; int qpow(int a, int pos, int m) {
int pa = a, rt = ;
for ( ; pos; pos >>= , pa = pa * 1ll * pa % m)
if (pos & )
rt = rt * 1ll * pa % m;
return rt;
} int gcd (int a, int b) {
return (b) ? (gcd(b, a % b)) : (a);
} void exgcd(int a, int b, int& d, int &x, int &y) {
if (!b)
d = a, x = , y = ;
else {
exgcd(b, a % b, d, y, x);
y -= (a / b) * x;
}
} int inv(int a, int n) {
int d, x, y;
exgcd(a, n, d, x, y);
return (x < ) ? (x + n) : (x);
} int T;
int p, a, b, x1, t; inline void init() {
scanf("%d%d%d%d%d", &p, &a, &b, &x1, &t);
} HashMap mp;
inline int ind(int x, int a, int p, int pro) {
mp.clear();
int cs = sqrt(p - + 0.5);
int ainv = inv(x, p), iap = a * 1ll * qpow(ainv, cs - , p) % p;
for (int i = cs - ; ~i; i--, iap = iap * 1ll * x % p)
mp.insert(iap, i);
int cp = qpow(x, cs, p), pw = pro;
for (int i = ; i < p; i += cs, pw = pw * 1ll * cp % p)
if (~mp[pw])
return mp[pw] + i;
return -;
} inline int solve1() {
if (!b) return (t == x1) ? () : (-);
int d, x, y, go = t + b - x1;
exgcd(b, p, d, x, y);
x = x * 1ll * go % p;
return (x <= ) ? (x + p) : (x);
} inline void solve() {
if (a == )
printf("%d\n", (t == x1) ? () : ((b == t) ? () : (-)));
else if (a == )
printf("%d\n", solve1());
else
printf("%d\n", ind(a, ((a - ) * 1ll * t + b) % p, p, (x1 * 1ll * (a - ) + b) % p) + );
} int main() {
scanf("%d", &T);
while (T--) {
init();
solve();
}
return ;
}

bzoj 3122 随机数生成器 - BSGS的更多相关文章

  1. BZOJ 3122 随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 题意:给出p,a,b,x1,t 已知xn=a*xn-1+b%p,求最小的n令xn=t 首先,若 ...

  2. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  3. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

  4. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  5. bzoj 3122 : [Sdoi2013]随机数生成器 BSGS

    BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...

  6. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

    Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...

  7. BZOJ3122 随机数生成器——BSGS

    题意 链接 给定 $p,\ a,\ b, \ x_1$,现有一数列 $$x_{i+1} \equiv (ax_i + b) \ mod \ p$$ 求最小的 $i$ 满足 $x_i = t$ 分析 代 ...

  8. [BZOJ]3671 随机数生成器(Noi2014)

    洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...

  9. BZOJ3122: [Sdoi2013]随机数生成器(BSGS)

    题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...

随机推荐

  1. mysql 错误2002

    ERROR 2002 (HY000): Can’t connect to local MySQL server throughsocket ‘/tmp/mysql.sock’ (2) 今天遇到的200 ...

  2. mac connect to host localhost port 22: Connection refused

    在Mac OS X 10.10.5学习hadoop的过程中,输入命令ssh localhost得到 ssh: connect to host localhost port : Connection r ...

  3. 解决ORA-00257: 归档程序错误。在释放之前仅限于内部连接

    昨天尝试通过plsqldev尝试连接oracle数据库,报错,提示ORA-00257: 归档程序错误.在释放之前仅限于内部连接 通过查询,得知原因是archivedlog达到了数据库设置的空间限制. ...

  4. Vivado的安装程序没反应怎么办

    在Windows操作系统上,在安装Vivado的时候会遇到双击xsetup.exe没有反应的情况,即使是用管理员权限再加上设置兼容模式也没有任何效果,且此问题有可能在多个版本上都存在,包括最新的201 ...

  5. 《Semantic Sentence Matching with Densely-connected Recurrent and Co-attentive Information》DRCN 句子匹配

    模型结构 首先是模型图: 传统的注意力机制无法保存多层原始的特征,根据DenseNet的启发,作者将循环网络的隐层的输出与最后一层连接. 另外加入注意力机制,代替原来的卷积.由于最后的特征维度过大,加 ...

  6. [转载]web服务器

    Web系统由客户端(浏览器)和服务器端两部分组成.Web系统架构也被称为B/S架构.最常见的Web服务器有Apache.IIS等,常用的浏览器有IE.Firefox.chrome等.当你想访问一个网页 ...

  7. flask框架----flask-session组件

    简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...

  8. 像黑客一样使用Linux命令行(转载)

    阅读目录 前言 使用 tmux 复用控制台窗口 在命令行中快速移动光标 在命令行中快速删除文本 快速查看和搜索历史命令 快速引用和修饰历史命令 录制屏幕并转换为 gif 动画图片 总结 回到顶部 前言 ...

  9. 登录实现之servlet和SpringMVC

    #知识小点: 防止乱码的字符集的设置: request.setCharacterEncoding():确定从请求端发送到给服务器的编码是汉字字符集.该方法对get方法 无效,只对post方法有效.若要 ...

  10. php 使用fileupload上传多张图片,压缩包

    test.php <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...