题目链接

怎么这么多随机数生成器

题意见原题。

很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列。

但是可以用矩阵乘法来求出第\(i\)项,所以好像可以用\(BSGS\)套矩阵乘法?但是总要把那个常数项除过来吧,矩阵除法是什么鬼?

无奈只好放弃去看题解。

看完之后,哎,我太蒻了。

\[X_{i+1}=(aX_i+b)\mod p
\]

\[X_{i+1}=a(X_i+\frac{b}{a})\mod p
\]

\[X_{i+1}=(aX_i+\frac{ab}{a})\mod p
\]

\[X_{i+1}=(aX_i+\frac{(a-1)b}{a-1})\mod p
\]

\[X_{i+1}+\frac{b}{a-1}=(aX_i+\frac{ab}{a-1})\mod p
\]

\[X_{i+1}+\frac{b}{a-1}=a(X_i+\frac{b}{a-1})\mod p
\]

然后,你发现了什么?

没错,式子两边都有一个\(X+\frac{b}{a-1}\)。

把上面这个式子的左边再乘一个\(a\)就能得到\(X_{i+2}+\frac{b}{a-1}\)。

于是就有

\[X_n+\frac{b}{a-1}=a^{n-1}(X_1+\frac{b}{a-1})\mod p
\]

\[\frac{X_n+\frac{b}{a-1}}{X_1+\frac{b}{a-1}}\equiv a^{n-1}\pmod p
\]

左边的都是已知的,对左边有理数取余,然后就可以\(BSGS\)了,不会\(BSGS\)的戳这里

另外对\(a=0,1\)或者\(X_1=t\)要特判一下

#include <cstdio>
#include <map>
#include <cmath>
#include <cstdlib>
#define ll long long
using namespace std;
int fast_pow(int n, int k, int p){ //n^k%p
int ans = 1;
while(k){
if(k & 1) ans = (long long)ans * n % p;
n = (long long)n * n % p;
k >>= 1;
}
return ans;
}
int BSGS(int a, int b, int p){ //a^x≡b(mod p)
map <int, int> hash; hash.clear();
int t = ceil(sqrt(p));
for(int i = 0; i < t; ++i){
int val = (long long)b * fast_pow(a, i, p) % p;
hash[val] = i;
}
a = fast_pow(a, t, p);
if(!a) return !b ? 1 : -1;
for(int i = 0; i <= t; ++i){
int j = fast_pow(a, i, p);
int k = hash.find(j) == hash.end() ? -1 : hash[j];
if(k >= 0 && (i * t - k) >= 0) return i * t - k;
}
return -1;
}
void exgcd(int a, int b, int &x, int &y){
if(!b){
x = 1; y = 0;
return;
}
exgcd(b, a % b, x, y);
int z = x; x = y; y = z - (a / b) * y;
}
int T;
int p, a, b, x, t;
int X, Y;
int main(){
scanf("%d", &T);
while(T--){
scanf("%d%d%d%d%d", &p, &a, &b, &x, &t);
if(x == t) { printf("1\n"); continue; }
if(!a){
if(t == b) printf("2\n");
else printf("-1\n");
continue;
}
if(a == 1 && !b) { printf("-1\n"); continue; }
if(a == 1){
int r = fast_pow(b, p - 2, p);
printf("%d\n",(((((long long)t - x) % p + p) % p) * r % p) % p + 1);
continue;
}
int u = fast_pow(a - 1, p - 2, p);
u = (long long)b * ((u % p + p) % p) %p;
exgcd((x + u) % p, p, X, Y);
X = (long long)(t + u) * ((X % p + p) % p) % p;
int ans = BSGS(a, X, p);
printf("%d\n", ~ans ? ans + 1 : ans);
}
return 0;
}

【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)的更多相关文章

  1. 洛谷P3306 [SDOI2013]随机数生成器(BSGS)

    传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...

  2. 洛咕 P3306 [SDOI2013]随机数生成器

    洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...

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

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

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

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

  5. P3306 [SDOI2013]随机数生成器(bzoj3122)

    洛谷 bzoj 特判+多测真恶心 . \(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\) Sample Input 3 7 1 1 3 3 7 2 2 2 0 ...

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

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

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

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

  8. 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用

    题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...

  9. [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列

    题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...

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

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

随机推荐

  1. Java测试工具和框架

    个人目前只接触过JUnit以及Powermock,后续会关注更多有关测试这方面的东西 8个超实用的Java测试工具和框架_开发/数据库_IT专家网 http://database.ctocio.com ...

  2. OpenCV入门:(五:更改图片对比度和亮度)

    1. 理论 图片的转换就是将图片中的每个像素点经过一定的变换,得到新像素点,新像素点组合成一张新的图片. 改变图片对比度和亮度的变换如下: 其中α和β被称作增益参数(gain parameter)和偏 ...

  3. java 判断上午/下午

    //结果为“0”是上午 结果为“1”是下午 public class GregorianTest { public static void main(String args[]) { Gregoria ...

  4. 「日常训练」 不容易系列之(3)—— LELE的RPG难题 (HDU 2045)

    题目简述 有排成一行的n" role="presentation">nn个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何 ...

  5. 详谈P(查准率),R(查全率),F1值

    怎么来的? 我们平时用的精度accuracy,也就是整体的正确率 acc = predict_right_num / predict_num 这个虽然常用,但不能满足所有任务的需求.比如,因为香蕉太多 ...

  6. Codeforces Round #345 Div.1 D.Zip-line 动态最长上升子序列

    题意概述: 给出一个长度为N的序列和M组询问,问假设把某个位置的值改成另一个给出的值之后,序列的最长上升子序列的长度. N,M<=400000. 分析: 考虑某个位置的值改动后这个位置和最长上升 ...

  7. 二分图最大权匹配:Kuhn-Munkres算法

    http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646535.html

  8. 从微软msdn阅读事件的使用

    微软文章:如何:在 Windows 窗体应用程序中使用事件 地址:https://msdn.microsoft.com/zh-cn/library/0y0987sc.aspx 文章:C#事件的订阅与触 ...

  9. PHP整数取余返回负数解决办法

    <?php $num1 = 1494313163777; $num2 = 9999; //直接计算取余会出错,出现负数 -8779 //echo $num1 % $num2;exit; //算上 ...

  10. maven打包遇到的问题

    1.javax.servlet.jsp.tagext不存在 maven打包报程序包javax.servlet.jsp.tagext不存在或者maven打包报程序包javax.servlet.jsp不存 ...