题意

婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的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的余数。

分析

初始矩阵\(A_3\)

\[A_3=
\left[
\begin{matrix}
1\\
1
\end{matrix}
\right]
\]

列转移矩阵\(A_1\)

\[A_1=
\left[
\begin{matrix}
a & b\\
0 & 1
\end{matrix}
\right]
\]

行转移矩阵\(A_2\)

\[A_2=
\left[
\begin{matrix}
c & d\\
0 & 1
\end{matrix}
\right]
\]

转移到最后一行,最后一列,应该是

\[A_1^{m-1}(A_2A_1^{m-1})^{n-1}A_3
\]

代码

n,m是十进制大数,需要十进制快速幂。

此题还有数学分析做法,矩阵的做法卡常数,需要O3才能过

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define il inline
#define rg register
#pragma GCC optimize ("O3")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int mod=1e9+7; struct Matrix
{
int data[2][2]; il Matrix()
{
memset(data,0,sizeof(data));
} il int*operator[](rg const int&x)
{
return data[x];
} il Matrix operator*(rg const Matrix&rhs)
{
rg Matrix res;
for(rg int i=0;i<2;++i)
for(rg int j=0;j<2;++j)
for(rg int k=0;k<2;++k)
{
res[i][j] += (ll)data[i][k] * rhs.data[k][j] % mod;
if(res[i][j] >= mod)
res[i][j] -= mod;
}
return res;
} il Matrix&operator*=(rg const Matrix&rhs)
{
return *this=*this*rhs;
}
}A1,A2,A3; il Matrix spow(rg Matrix x,rg int k)
{
rg Matrix res;
for(rg int i=0;i<2;++i)
res[i][i]=1;
while(k)
{
if(k&1)
res*=x;
x*=x,k>>=1;
}
return res;
} il Matrix bpow(rg Matrix x,rg char*k)
{
rg Matrix res;
for(rg int i=0;i<2;++i)
res[i][i]=1;
rg int len=strlen(k+1);
for(rg int i=len;i;--i)
{
res *= spow(x,k[i]-'0');
x = spow(x,10);
}
return res;
} const int MAXN=1e6+7;
char n[MAXN],m[MAXN];
int a,b,c,d; int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%s %s",n+1,m+1);
read(a);read(b);read(c);read(d);
int nl=strlen(n+1),ml=strlen(m+1);
for(rg int i=nl;i;--i)
{
if(n[i]=='0')
n[i]='9';
else
{
n[i]--;
break;
}
}
for(rg int i=ml;i;--i)
{
if(m[i]=='0')
m[i]='9';
else
{
m[i]--;
break;
}
}
A1[0][0]=a,A1[0][1]=b,A1[1][1]=1;
A1=bpow(A1,m);
A2[0][0]=c,A2[0][1]=d,A2[1][1]=1;
A2*=A1,A2=A1*bpow(A2,n);
printf("%d\n",(A2[0][0]+A2[0][1])%mod);
// fclose(stdin);
// fclose(stdout);
return 0;
}

LG1397 [NOI2013]矩阵游戏的更多相关文章

  1. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  2. BZOJ 3240: [Noi2013]矩阵游戏

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1586  Solved: 698[Submit][Status ...

  3. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 123   Solved: 73 [ Submit][ St ...

  4. (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  M ...

  5. P1397 [NOI2013]矩阵游戏(递推)

    P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...

  6. 【bzoj3240】 Noi2013—矩阵游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3240 (题目链接) 题意$${F[1][1]=1}$$$${F[i][j]=a*F[i][j-1]+ ...

  7. BZOJ3240 [Noi2013]矩阵游戏

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  8. 3240: [Noi2013]矩阵游戏

    Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...

  9. NOI2013矩阵游戏

    Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...

随机推荐

  1. LeetCode--198--打家劫舍

    问题描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...

  2. 27 网络通信协议 tcp udp subprocess

    1.模块subprocess import subprocess cmd_str = input('请输入指令>>>') sub_obj = subprocess.Popen( cm ...

  3. JDBC连接SQLSERVER

    package xhs;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; im ...

  4. Linux中的yum是什么?如何配置?如何使用?

    yum,是Yellow dog Updater Modified的简称,起初是由yellow dog这一发行版的开发者Terra Soft研发,用python写成,那时还叫做yup(yellow do ...

  5. SSH 不分配远程主机tty

    $ host N参数,表示只连接远程主机,不打开远程shell:T参数,表示不为这个连接分配TTY.这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作.

  6. RowMapper使用

    public class ABRow implements RowMapper<AABB> { private String CMC; @Override public AABB mapR ...

  7. BZOJ1670 [Usaco2006 Oct]Building the Moat护城河的挖掘

    裸的凸包...(和旋转卡壳有什么关系吗...蒟蒻求教T T) 话说忘了怎么写了...(我以前都是先做上凸壳再做下凸壳的说) 于是看了下hzwer的写法,用了向量的点积,方便多了,于是果断学习(Orz) ...

  8. 微信小程序wx.chooseImage和wx.previewImage的综合使用(图片上传不限制最多张数)

    WXML: <view class="weui"> <view class="weui-uploader"> <view clas ...

  9. learning shell script prompt to run with superuser privileges (4)

    Shell script prompt to run with superuser privileges [Purpose]        Check whether have root privil ...

  10. Scrapy-redis实现分布式爬取的过程与原理

    Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个主机的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求 ...