NOI2013矩阵游戏
Description
婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储)。她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下面的递推式:
F[1][1]=1
F[i,j]=a*F[i][j-1]+b (j!=1)
F[i,1]=c*F[i-1][m]+d (i!=1)
递推式中a,b,c,d都是给定的常数。
现在婷婷想知道F[n][m]的值是多少,请你帮助她。由于最终结果可能很大,你只需要输出F[n][m]除以1,000,000,007的余数。
Input
一行有六个整数n,m,a,b,c,d。意义如题所述
Output
包含一个整数,表示F[n][m]除以1,000,000,007的余数
Sample Input
3 4 1 3 2 6
Sample Output
85
HINT
样例中的矩阵为:
1 4 7 10
26 29 32 35
76 79 82 85

题解:
不看数据范围的话这就是到水题……
前10个点很好过,普通的二进制快速幂就可以
后面10个点如果还用原来的方法,需要涉及高精度除以单精度,复杂度是O(len)的
所以一种新的快速幂诞生了!-----十进制快速幂!
(转)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
再举个例子吧...
const p=;
type matrix=array[..,..] of longint;
var a,b,c:matrix;
i,n,m,a1,a2,b1,b2:longint;
procedure mul(var x,y,z:matrix);
var t:matrix;
i,j,k:longint;
begin
fillchar(t,sizeof(t),);
for i:= to do
for j:= to do
for k:= to do
t[i,j]:=(t[i,j]+x[i,k]*y[k,j]) mod p;
z:=t;
end;
procedure ksm(cs:longint);
begin
while cs> do
begin
if cs and = then mul(a,b,b);
cs:=cs>>;
mul(a,a,a);
end;
end;
procedure init;
begin
readln(n,m,a1,b1,a2,b2);
end;
procedure main;
begin
a[,]:=;a[,]:=b1;a[,]:=;a[,]:=a1;
for i:= to do b[i,i]:=;
ksm(m-);
c:=b;
b[,]:=;b[,]:=b2;b[,]:=;b[,]:=a2;
mul(c,b,a);
fillchar(b,sizeof(b),);
for i:= to do b[i,i]:=;
ksm(n-);
mul(b,c,b);
writeln((b[,]+b[,]) mod p);
end;
begin
init;
main;
end.
代码2:80分 十进制快速幂(后四个点TLE)
const p=;
type matrix=array[..,..] of longint;
arrtype=array[..] of longint;
var a,b,c:matrix;
mm:array[..] of matrix;
i,a1,a2,b1,b2:longint;
n,m:arrtype;
ch:char;
procedure mul(var x,y,z:matrix);
var t:matrix;
i,j,k:longint;
begin
fillchar(t,sizeof(t),);
for i:= to do
for j:= to do
for k:= to do
t[i,j]:=(t[i,j]+x[i,k]*y[k,j]) mod p;
z:=t;
end;
procedure pow10(s:arrtype);
var i,j:longint;t:matrix;
begin
dec(s[s[]]);i:=s[];while s[i]< do begin inc(s[i],);dec(s[i-],);dec(i);end;
fillchar(mm,sizeof(mm),);
for i:= to do mm[,i,i]:=;
for i:= to do mul(mm[i-],a,mm[i]);
fillchar(b,sizeof(b),);
for i:= to do b[i,i]:=;
for i:= to s[] do
begin
mul(b,mm[s[i]],b);
if i=s[] then break;
t:=b;
for j:= to do mul(b,t,b);
end;
end;
procedure init;
begin
read(ch);n[]:=;
while ch<>' ' do
begin
inc(n[]);n[n[]]:=ord(ch)-ord('');
read(ch);
end;
read(ch);m[]:=;
while ch<>' ' do
begin
inc(m[]);m[m[]]:=ord(ch)-ord('');
read(ch);
end;
readln(a1,b1,a2,b2);
end;
procedure main;
begin
a[,]:=;a[,]:=b1;a[,]:=;a[,]:=a1;
pow10(m);
c:=b;
b[,]:=;b[,]:=b2;b[,]:=;b[,]:=a2;
mul(c,b,a);
pow10(n);
mul(b,c,b);
writeln((b[,]+b[,]) mod p);
end;
begin
init;
main;
end.
代码3:80分 考虑把代码二中 ans^10换成二进制快速幂(依然TLE)
const p=;
type matrix=array[..,..] of int64;
arrtype=array[..] of longint;
var a,b,c:matrix;
mm:array[..] of matrix;
i,a1,a2,b1,b2:longint;
n,m:arrtype;
ch:char;
procedure mul(var x,y,z:matrix);
var t:matrix;
i,j,k:longint;
begin
fillchar(t,sizeof(t),);
for i:= to do
for j:= to do
for k:= to do
t[i,j]:=(t[i,j]+x[i,k]*y[k,j]) mod p;
z:=t;
end;
procedure pow10(s:arrtype);
var i,j,cs:longint;tmp:matrix;
begin
dec(s[s[]]);i:=s[];while s[i]< do begin inc(s[i],);dec(s[i-],);dec(i);end;
fillchar(mm,sizeof(mm),);
for i:= to do mm[,i,i]:=;
for i:= to do mul(mm[i-],a,mm[i]);
fillchar(b,sizeof(b),);
for i:= to do b[i,i]:=;
for i:= to s[] do
begin
mul(b,mm[s[i]],b);
if i=s[] then break;
tmp:=b;
fillchar(b,sizeof(b),);
for j:= to do b[j,j]:=;
cs:=;
while cs> do
begin
if cs and = then mul(tmp,b,b);
cs:=cs>>;
mul(tmp,tmp,tmp);
end;
end;
end;
procedure init;
begin
read(ch);n[]:=;
while ch<>' ' do
begin
inc(n[]);n[n[]]:=ord(ch)-ord('');
read(ch);
end;
read(ch);m[]:=;
while ch<>' ' do
begin
inc(m[]);m[m[]]:=ord(ch)-ord('');
read(ch);
end;
readln(a1,b1,a2,b2);
end;
procedure main;
begin
a[,]:=;a[,]:=b1;a[,]:=;a[,]:=a1;
pow10(m);
c:=b;
b[,]:=;b[,]:=b2;b[,]:=;b[,]:=a2;
mul(c,b,a);
pow10(n);
mul(b,c,b);
writeln((b[,]+b[,]) mod p);
end;
begin
init;
main;
end.
代码4:受兰多夫87的影响,考虑修改矩阵乘法,应为第一列始终是不变的 (为什么还是TLE啊…………)
const p=;
type matrix=array[..,..] of int64;
arrtype=array[..] of longint;
var a,b,c:matrix;
mm:array[..] of matrix;
i,a1,a2,b1,b2:longint;
n,m:arrtype;
ch:char;
procedure mul(var x,y,z:matrix);
var t:matrix;
i,j,k:longint;
begin
fillchar(t,sizeof(t),);
t[,]:=;t[,]:=;
for i:= to do
for k:= to do
t[i,]:=(t[i,]+x[i,k]*y[k,]) mod p;
z:=t;
end;
procedure pow10(s:arrtype);
var i,j,cs:longint;tmp:matrix;
begin
dec(s[s[]]);i:=s[];while s[i]< do begin inc(s[i],);dec(s[i-],);dec(i);end;
fillchar(mm,sizeof(mm),);
for i:= to do mm[,i,i]:=;
for i:= to do mul(mm[i-],a,mm[i]);
fillchar(b,sizeof(b),);
for i:= to do b[i,i]:=;
for i:= to s[] do
begin
mul(b,mm[s[i]],b);
if i=s[] then break;
tmp:=b;
fillchar(b,sizeof(b),);
for j:= to do b[j,j]:=;
cs:=;
while cs> do
begin
if cs and = then mul(tmp,b,b);
cs:=cs>>;
mul(tmp,tmp,tmp);
end;
end;
end;
procedure init;
begin
read(ch);n[]:=;
while ch<>' ' do
begin
inc(n[]);n[n[]]:=ord(ch)-ord('');
read(ch);
end;
read(ch);m[]:=;
while ch<>' ' do
begin
inc(m[]);m[m[]]:=ord(ch)-ord('');
read(ch);
end;
readln(a1,b1,a2,b2);
end;
procedure main;
begin
a[,]:=;a[,]:=b1;a[,]:=;a[,]:=a1;
pow10(m);
c:=b;
b[,]:=;b[,]:=b2;b[,]:=;b[,]:=a2;
mul(c,b,a);
pow10(n);
mul(b,c,b);
writeln((b[,]+b[,]) mod p);
end;
begin
init;
main;
end.
代码5:我认为是我写丑了 膜拜兰多夫87吧
const p=;
type matrix=array[..] of int64;
arrtype=array[..] of longint;
var x,y:matrix;
z:array[..] of matrix;
i,a,b,c,d:longint;
n,m:arrtype;
ch:char;
operator *(a,b:matrix)c:matrix;
begin
c[]:=a[]*b[] mod p;
c[]:=(b[]*a[]+b[]) mod p;
end;
function f(x:matrix;var a:arrtype):matrix;
var i:longint;y:matrix;
begin
dec(a[a[]]);i:=a[];
while a[i]< do begin inc(a[i],);dec(a[i-]);dec(i);end;
z[,]:=;z[,]:=;
for i:= to do z[i]:=z[i-]*x;
x:=z[];
for i:= to a[] do
begin
y:=x*x;
x:=x*y*y;
x:=x*x;
x:=x*z[a[i]];
end;
exit(x);
end;
procedure init;
begin
read(ch);n[]:=;
while ch<>' ' do
begin
inc(n[]);n[n[]]:=ord(ch)-ord('');
read(ch);
end;
read(ch);m[]:=;
while ch<>' ' do
begin
inc(m[]);m[m[]]:=ord(ch)-ord('');
read(ch);
end;
readln(a,b,c,d);
end;
procedure main;
begin
x[]:=a;x[]:=b;
x:=f(x,m);
y[]:=c;y[]:=d;
y:=x*y;
y:=f(y,n);
y:=y*x;
writeln((y[]+y[]) mod p);
end;
begin
assign(input,'matrix.in');assign(output,'matrix.out');
reset(input);rewrite(output);
init;
main;
close(input);close(output);
end.
无限orz!
看来养成一个好的代码风格是必要的
NOI2013矩阵游戏的更多相关文章
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
- BZOJ 3240: [Noi2013]矩阵游戏
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1586 Solved: 698[Submit][Status ...
- BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 123 Solved: 73 [ Submit][ St ...
- (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec M ...
- P1397 [NOI2013]矩阵游戏(递推)
P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...
- 【bzoj3240】 Noi2013—矩阵游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3240 (题目链接) 题意$${F[1][1]=1}$$$${F[i][j]=a*F[i][j-1]+ ...
- BZOJ3240 [Noi2013]矩阵游戏
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 3240: [Noi2013]矩阵游戏
Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...
- 洛谷P1397 [NOI2013]矩阵游戏
矩阵快速幂+费马小定理 矩阵也是可以跑费马小定理的,但是要注意这个: (图是盗来的QAQ) 就是说如果矩阵a[i][i]都是相等的,那么就是mod p 而不是mod p-1了 #include< ...
随机推荐
- php入门变量
变量是用于临时存储值的容器.这些值可以是数字.文本,或者是复杂得多的数据. PHP 具有8种变量. 其中包括4种标量(单值)类型——字符串型(字符).整型.浮点型(小数)和布尔型(TRUE或FALSE ...
- ScheduledExecutorService的用法——定时执行两个任务
package control; import java.text.DateFormat; import java.text.ParseException; import java.text.Simp ...
- size()函数的使用
matlab中对于矩阵的计算是十分方便的,其中关于矩阵的函数有很多 size() 在c/c++中sizeof用来求某变量所占用的字节数,在matlab中size()则可以用来求矩阵的“长度”,矩阵的长 ...
- 关于CSS的图像放大问题的解决,需要借助jQuery等直接用css3设置
W3C标准中对css3的transition这是样描述的:“css的transition允许css的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发, ...
- oracle闪回表详解
--- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...
- GridView ItemCommand
GridView ItemCommand中取某行某列的值方法,这里提供两个常用的: 一.用CommandArgument属性取值页面如下: <asp:TemplateColumn HeaderT ...
- linux驱动系列之ubuntu快捷键(转)
Ubuntu快捷键-终端快捷键 1.关于终端的快捷键: Tab:tab键是比较常用的一个快捷键,它的作用是补全文件名或者路径.举例 来说,输入”cd /ho”在按一下tab键,终端里就会显示 ...
- 3111: [Zjoi2013]蚂蚁寻路 - BZOJ
题目描述 Description在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长.蚂蚁转弯是有一定 ...
- myeclipse报jar包missing
一.问题描述 从版本库中check out项目后,发现项目有“感叹号”,且pom.xml文件有红色的“差号”.如下图: 在error window里可以看到missing jar包的提示,如下: 打开 ...
- [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg
在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...