题意

婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的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. 动态规划3--Help Jimmy

    动态规划3--Help Jimmy 一.心得 二.题目 三.分析 Jimmy跳到一块板上后,可以有两种选择,向左走,或向右走.走到左端和走到右端所需的时间,是很容易算的.如果我们能知道,以左端为起点到 ...

  2. yii CComponent组件 实例说明1

    yii CComponent组件 实例说明 yii中的module,controller都是CComponent的子类,可以说yii的架构基石就是依托在CCompnent基础上的,这里研究下CComp ...

  3. django-celery定时任务以及异步任务and服务器部署并且运行全部过程

    Celery 应用Celery之前,我想大家都已经了解了,什么是Celery,Celery可以做什么,等等一些关于Celery的问题,在这里我就不一一解释了. 应用之前,要确保环境中添加了Celery ...

  4. Python下尝试实现图片的高斯模糊化

    资源下载 #本文PDF版下载Python下尝试实现图片的高斯模糊化#本文代码下载高斯模糊代码下载 高斯模糊是什么? (先来看一下维基百科对它的定义) 高斯模糊是模糊图像的结果.它是一种广泛使用的图形软 ...

  5. 『Scrapy』终端调用&选择器方法

    Scrapy终端 示例,输入如下命令后shell会进入Python(或IPython)交互式界面: scrapy shell "http://www.itcast.cn/channel/te ...

  6. bzoj1833: [ZJOI2010]count 数字计数 数位dp

    bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...

  7. python 爬虫系列教程方法总结及推荐

    爬虫,是我学习的比较多的,也是比较了解的.打算写一个系列教程,网上搜罗一下,感觉别人写的已经很好了,我没必要重复造轮子了. 爬虫不过就是访问一个页面然后用一些匹配方式把自己需要的东西摘出来. 而访问页 ...

  8. doom启示录

    半个小时之后,doom的最后一个字节抵达威斯康星大学,瞬间,上万名玩家涌向那台服务器,淹没了她,威斯康星大学的服务器瘫痪了,大卫的服务器崩溃了. “天哪”大卫在电话里结结巴巴地对杰伊说:“我还从没见过 ...

  9. python打包工具pyinstaller的使用

    安装PyInstaller pip install pyinstaller 安装完后,检查安装成功与否: pyinstaller --version 安装成功后,就可以使用下面的命令了: pyinst ...

  10. Final阶段第1周/共1周 Scrum立会报告+燃尽图 01

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2411] 版本控制:https://git.coding.net/liuyy08 ...