[NOI2012] 随机数生成器 [CodeVS1281] Xn数列
2015-08-09 18:09
393 查看
题目描述 Description
给你6个数,m, a, c, x0, n, gXn+1 = ( aXn + c ) mod m,求Xn
m, a, c, x0, n, g<=10^18
输入描述 Input Description
一行六个数 m, a, c, x0, n, g输出描述 Output Description
输出一个数 Xn mod g样例输入 Sample Input
11 8 7 1 5 3样例输出 Sample Output
2题解
[xnc]=[xn−1c]⋅[a101]\begin{bmatrix} x_n&c\end{bmatrix}=\begin{bmatrix} x_{n-1}&c\end{bmatrix}\cdot \begin{bmatrix} a&0\\1&1 \end{bmatrix}甭管什么直接矩阵乘法都会爆炸QAQ
所以模仿快速幂写个快速加(a*b=a+a+a+…..+a)
其实你想更快的话,,你会发现那个2X2的矩阵的第2列是不变的,,
var m,a,c,x0,n,s,ans:int64; d,e,f,g:qword; t,y:array[1..2,1..2]of qword; i,j,k:longint; function mmod(a,b:int64):qword; var len:int64; begin len:=0; while b<>0 do begin if (b and 1)=1 then len:=(len+a)mod m; a:=(a*2)mod m; b:=b div 2; end; exit(len); end; begin readln(m,a,c,x0,n,s); t[1,1]:=1; t[1,2]:=0; t[2,1]:=0; t[2,2]:=1; y[1,1]:=a; y[1,2]:=0; y[2,1]:=1; y[2,2]:=1; while n<>0 do begin if (n and 1)=1 then begin {t=t*y} d:=(mmod(t[1,1],y[1,1])+mmod(t[1,2],y[2,1]))mod m; e:=(mmod(t[1,1],y[1,2])+mmod(t[1,2],y[2,2]))mod m; f:=(mmod(t[2,1],y[1,1])+mmod(t[2,2],y[2,1]))mod m; g:=(mmod(t[2,1],y[1,2])+mmod(t[2,2],y[2,2]))mod m; t[1,1]:=d; t[1,2]:=e; t[2,1]:=f; t[2,2]:=g; end; {y=y*y} d:=(mmod(y[1,1],y[1,1])+mmod(y[1,2],y[2,1]))mod m; e:=(mmod(y[1,1],y[1,2])+mmod(y[1,2],y[2,2]))mod m; f:=(mmod(y[2,1],y[1,1])+mmod(y[2,2],y[2,1]))mod m; g:=(mmod(y[2,1],y[1,2])+mmod(y[2,2],y[2,2]))mod m; y[1,1]:=d; y[1,2]:=e; y[2,1]:=f; y[2,2]:=g; n:=n div 2; end; ans:=(((mmod(x0,t[1,1])+mmod(c,t[2,1])+m)mod m)+s)mod s; writeln(ans); end.
相关文章推荐
- gcc编译选项
- 2015-写给明年现在的自己
- Router和History (路由控制)-backbone
- 解决Ubuntu(Linux)平台下Sublime Text 3 安装中文输入支持库后 开启gnome-terminal报错的问题
- makefile 文件 ( http://blog.csdn.net/ruglcc/article/details/7814546/ )
- Progressbar设置大小
- Nim中文件IO
- 关于c语言代码的规范(后期会更新)
- Object分析--2,equals()分析
- C++STL位标志、智能指针与异常处理
- 运算符
- UE4发报机-Create Event将函数转换为事件绑定
- 第81讲:Scala中List的构造是的类型约束逆变、协变、下界
- hdu1198
- [转]使用Cadence ADE + Spectre做Montel Carlo仿真
- XML Schema命名空间:xmlns介绍
- C语言中的__FILE__、__LINE__和#line
- Java CAS 和ABA问题
- Codeforces548C:Mike and Frog
- Java记录 -5- 运算符续 Operator