还有20天就NOI了。。
赶紧做真题= -=
很简单= -=
矩阵乘法乱搞可以85分
然后剩下的5分因为爆int64
可以用快速乘
就是a*b写成b个a连加的形式
这个我们可以类比快死幂写一个快速乘
这样就解决了2个10^18相乘爆int64的问题了
快速乘详情看下面代码的plus函数
var
i,j,k:longint;
m,a,c,x0,n,g,t:qword;
ans,x,y:array[0..2,0..2] of qword;
function plus(a,b:qword):qword;
var
c:qword;
begin
if a<b then
begin
c:=a;
a:=b;
b:=c;
end;
c:=0;
while b<>0 do
begin
if b mod 2=1 then c:=(c+a) mod m;
a:=(a+a) mod m;
b:=b div 2;
end;
exit(c);
end;
begin
read(m,a,c,x0,n,g);
ans[1,1]:=1;ans[2,2]:=1;
x[1,1]:=a;x[2,1]:=1;x[2,2]:=1;
fillchar(y,sizeof(y),0);
while n<>0 do
begin
if n mod 2=1 then
begin
for i:=1 to 2 do
for j:=1 to 2 do
for k:=1 to 2 do
y[i,k]:=(y[i,k]+plus(ans[i,j],x[j,k])) mod m;
for i:=1 to 2 do
for j:=1 to 2 do
ans[i,j]:=y[i,j];
fillchar(y,sizeof(y),0);
end;
for i:=1 to 2 do
for j:=1 to 2 do
for k:=1 to 2 do
y[i,k]:=(y[i,k]+plus(x[i,j],x[j,k])) mod m;
for i:=1 to 2 do
for j:=1 to 2 do
x[i,j]:=y[i,j];
fillchar(y,sizeof(y),0);
n:=n div 2;
end;
t:=((plus(x0,ans[1,1]) +plus(c,ans[2,1])) mod m) mod g;
writeln(t);
end.
RP++
弱者也要成为强者