【BZOJ2875】随机数生成器(矩阵快速幂)
【BZOJ2875】随机数生成器(矩阵快速幂)
题面
Description
栋栋最近迷上了随机算法,而随机数是生成随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机数{Xn}:
\]
其中mod m表示前面的数除以m的余数。从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。
用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用的C++和Pascal的产生随机数的库函数使用的也是这种方法。
栋栋知道这样产生的序列具有良好的随机性,不过心急的他仍然想尽快知道X[n]是多少。由于栋栋需要的随机数是0,1,...,g-1之间的,他需要将X[n]除以g取余得到他想要的数,即X[n] mod g,你只需要告诉栋栋他想要的数X[n] mod g是多少就可以了。
Input
输入包含6个用空格分割的整数m,a,c,X[0],n和g,其中a,c,X[0]是非负整数,m,n,g是正整数。
Output
输出一个数,即X[n] mod g
Sample Input
11 8 7 1 5 3
Sample Output
2
Hint
【样例说明】
计算得X[n]=X[5]=8,故(X[n] mod g) = (8 mod 3) = 2
【数据规模】
40%的数据中m为质数
30%的数据中m与a-1互质
50%的数据中n<=10^6
100%的数据中n<=10^18
40%的数据m,a,c,X[0]<=10^4
85%的数据m,a,c,X[0]<=10^9
100%的数据中m,a,c,X[0]<=10^18
100%的数据中g<=10^8
对于所有数据,n>=1,m>=1,a>=0,c>=0,X[0]>=0,g>=1。
题解
直接矩阵快速幂
乘法要用龟速乘
没了。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
inline ll read()
{
ll x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Dalao
{
ll s[2][2];
void clear()
{
memset(s,0,sizeof(s));
}
void init()
{
s[0][0]=s[1][1]=1;
}
};
ll M,A,C,X0,G,N;
ll ppow(ll a,ll b,ll MOD)
{
ll s=0;
while(b)
{
if(b&1)s=(s+a)%MOD;
a=(a+a)%MOD;
b>>=1;
}
return s;
}
Dalao operator *(Dalao a,Dalao b)
{
Dalao s;s.clear();
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
(s.s[i][j]+=ppow(a.s[i][k],b.s[k][j],M))%=M;
return s;
}
Dalao Pow(Dalao a,ll b)
{
Dalao s;s.clear();s.init();
while(b)
{
if(b&1)s=s*a;
a=a*a;
b>>=1;
}
return s;
}
int main()
{
M=read();A=read();C=read();X0=read();N=read();G=read();
Dalao k;
k.s[0][0]=A;k.s[0][1]=0;k.s[1][0]=k.s[1][1]=1;
k=Pow(k,N);
cout<<((ppow(X0,k.s[0][0],M)+ppow(C,k.s[1][0],M))%M)%G<<endl;
return 0;
}
【BZOJ2875】随机数生成器(矩阵快速幂)的更多相关文章
- bzoj2875随机数生成器——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵快速幂,把x和c分开求,最后加上即可: 为防止爆long long,要用快速乘. ...
- [日常摸鱼]bzoj2875[NOI2012]随机数生成器-矩阵快速幂
好裸的矩阵快速幂-然而我一开始居然构造不出矩阵- 平常两个的情况都是拿相邻两项放在矩阵里拿去递推的-然后我就一直构造不出来-其实把矩阵下面弄成1就好了啊orz #include<cstdio&g ...
- BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )
矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...
- [luogu2044][NOI2012] 随机数生成器 [矩阵快速幂]
题面: 传送门 思路: 看一眼这个公式: $x\left[n+1\right]=\left(a\ast x\left[n\right]+c\right) mod m$ 递推,数据范围$n\leq 10 ...
- [vijos1725&bzoj2875]随机数生成器<矩阵乘法&快速幂&快速乘>
题目链接:https://vijos.org/p/1725 http://www.lydsy.com/JudgeOnline/problem.php?id=2875 这题是前几年的noi的题,时间比较 ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
- 【BZOJ2875】【NOI2012】随机数生成器(矩阵快速幂)
[BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...
- [NOI2012]随机数生成器【矩阵快速幂】
NOI2012 随机数生成器 题目描述 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法 ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
随机推荐
- mac攻略(3) -- brew使用
[http://www.cnblogs.com/redirect/p/6131642.html] 1.介绍 brew是一个软件包管理工具,类似于centos下的yum或者ubuntu下的apt-get ...
- PHPStorm 常用 设置配置 和快捷键大全 Win/Mac
[转自 http://blog.csdn.net/fenglailea/article/details/53350080] PHPStorm 下载及主题样式下载 http://www.lanmps.c ...
- Swift iOS 日期操作:NSDate、NSDateFormatter
1.日期(NSDate) // 1.初始化 // 初始化一个当前时刻对象 var now = NSDate() // 初始化一个明天当前时刻对象 var tomorrow = NSDate(timeI ...
- 使用 Homebrew 安装 Git
3.2.3 使用 Homebrew 安装 Git 2011-07-27 08:52 蒋鑫 机械工业出版社 字号:T | T 综合评级: 想读(13) 在读(6) 已读(8) 品书斋鉴(1) ...
- mac下自带的Apache+PHP环境输出错误提示
sudo vim /etc/php.ini 找到 display_errors = Off ,把Off 改为 On . 最后为 display_errors = On ; 找到 error_repor ...
- CentOS7关闭/开启防火墙出现 Unit iptables.service failed to load
在vm中安装好tomcat,而且在liunx中使用nc命令可以返回成功,但是更换到window中访问不到tomcat的情况,是由于linux防火墙的问题造成的,传统的解决方式有2中 第一种解决方案: ...
- PHP不使用array_merge函数实现一维数组合并
function array_mer() { $arrays = func_get_args(); //获取当前函数中传递进来的所有参数,也就是所有一维数组 // echo '<pre>' ...
- Unicode字符集,各个语言的区间
链接:http://www.cnblogs.com/zl0372/p/unicode.html 链接:http://www.unicode.org/ 链接:https://zh.wikipedia.o ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记15
day15课程内容: 高阶函数 1.函数名可以进行赋值 2.函数名可以作为参数,也可以作为函数的返回值 def f(): print("高阶函数")def bar(a,b,c): ...
- uva1471 二叉搜索树
此题紫书上面有详细分析,关键是运用Set优化实现O(nlgn)复杂度 AC代码: #include<cstdio> #include<set> #include<algo ...