您的位置:首页 > 其它

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

2014-06-17 18:58 357 查看
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

快速幂+快速乘

type
matrix=array[1..2,1..2]of int64;
var
a,c,p,x0,n,g:int64;
x,y:matrix;

function kc(x,y:int64):int64;
begin
if y=0 then exit(0);
kc:=kc(x,y>>1);
kc:=(kc+kc)mod p;
if y and 1=1 then kc:=(kc+x)mod p;
end;

operator *(a,b:matrix)c:matrix;
var
i,j,k:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to 2 do
for j:=1 to 2 do
for k:=1 to 2 do
c[i,k]:=(c[i,k]+kc(a[i,j],b[j,k]))mod p;
end;

procedure main;
begin
read(p,a,c,x0,n,g);
x[1,1]:=1;x[2,2]:=1;
y[1,1]:=a;y[2,1]:=c;y[2,2]:=1;
while n>0 do
begin
if n and 1=1 then x:=x*y;
y:=y*y;
n:=n>>1;
end;
writeln((kc(x0,x[1,1])+x[2,1])mod p mod g);
end;

begin
main;
end.


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: