2875: [Noi2012]随机数生成器 - BZOJ

Description
Input

包含6个用空格分割的m,a,c,X0,n和g,其中a,c,X0是非负整数,m,n,g是正整数。

Output

输出一个数,即Xn mod g
Sample Input

11 8 7 1 5 3

Sample Output
2

快速幂+快速乘

 1 type
 2     matrix=array[1..2,1..2]of int64;
 3 var
 4     a,c,p,x0,n,g:int64;
 5     x,y:matrix;
 6
 7 function kc(x,y:int64):int64;
 8 begin
 9     if y=0 then exit(0);
10     kc:=kc(x,y>>1);
11     kc:=(kc+kc)mod p;
12     if y and 1=1 then kc:=(kc+x)mod p;
13 end;
14
15 operator *(a,b:matrix)c:matrix;
16 var
17     i,j,k:longint;
18 begin
19     fillchar(c,sizeof(c),0);
20     for i:=1 to 2 do
21         for j:=1 to 2 do
22             for k:=1 to 2 do
23                 c[i,k]:=(c[i,k]+kc(a[i,j],b[j,k]))mod p;
24 end;
25
26 procedure main;
27 begin
28     read(p,a,c,x0,n,g);
29     x[1,1]:=1;x[2,2]:=1;
30     y[1,1]:=a;y[2,1]:=c;y[2,2]:=1;
31     while n>0 do
32         begin
33             if n and 1=1 then x:=x*y;
34             y:=y*y;
35             n:=n>>1;
36         end;
37     writeln((kc(x0,x[1,1])+x[2,1])mod p mod g);
38 end;
39
40 begin
41     main;
42 end.

2875: [Noi2012]随机数生成器 - BZOJ

时间: 2024-11-02 07:42:52

2875: [Noi2012]随机数生成器 - BZOJ的相关文章

BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

矩阵快速幂...+快速乘就OK了 -------------------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; typedef long long ll; ll MOD, a, c, x, n, g; ll MUL(ll a, ll b) { ll ans = 0; for(; b; b >>= 1

【BZOJ】2875: [Noi2012]随机数生成器(矩阵乘法+快速乘)

http://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵的话很容易看出来.....我就不写了.太水了. 然后乘法longlong会溢出...那么我们用快速乘...就是将快速幂的乘法变成加法...这种很简单吧.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream>

[bzoj 2875][noi2012]随机数生成器

传送门 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me thod)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机 数X[n]X[n+1]=(aX[n]+c)mod m其中mod m表示前面的数除以m的余数.从这个式子可以看出,这个序列的下一个数 总是由上一个数生成的.用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用

bzoj 2875 [Noi2012]随机数生成器 矩阵乘法

题面 题目传送门 解法 矩阵乘法sb题 注意整数乘法要使用龟速乘,否则会爆long long 代码 #include <bits/stdc++.h> #define int long long using namespace std; struct Matrix { int a[4][4]; void Clear() {memset(a, 0, sizeof(a));} }; int n, m, a, c, x, g; int mul(int x, int y) { int ret = 0;

矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器

963. [NOI2012] 随机数生成器 ★★   输入文件:randoma.in   输出文件:randoma.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机数{Xn}:X[n+1]=(aX[n]+c) mod m 其中mo

[NOI2012] 随机数生成器

963. [NOI2012] 随机数生成器 ★★   输入文件:randoma.in   输出文件:randoma.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机数&{X_n}&: Xn+1=(aXn+c)mod m 其中m

bzoj2875: [Noi2012]随机数生成器

矩阵乘法. x[n] = {x[0],1} * ( {a,0} ^ n ) {b,1} 写成这样谁能看懂.... noi里的大水题.我居然 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define LL long long using namespace std; const int maxn = 2; LL a,b,mod,g,x,n,ans; LL

【矩阵乘】【NOI 2012】【cogs963】随机数生成器

963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对照 时间限制:1 s 内存限制:128 MB **[问题描写叙述] 栋栋近期迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列.这样的方法须要设置四个非负整数參数m,a,c,X[0],依照以下的公式生成出一系列随机数{Xn}: X[n+1]=(aX[n]+c) mod m 当中mod

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

3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Output 共T行,每行一个整数表示他最早读到第t页是哪一天.如果他永远不会读到第t页,输出-1. Sa