题意

婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的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. Java中泛型使用

    Java中泛型使用 泛型作用: 泛型:集合类添加对象不用强转 反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码: ArrayList<Ls> ff=new ArrayList ...

  2. WPF 阴影效果

    WPF 阴影效果 制作WPF的阴影效果可以有很多种,貌似后来性能不好,然后被微软给X掉了.现在只有几个是可以用的,先暂时学习下现在有的,等以后看看用什么来代替原来的那些效果. 1.首先最常见的一个阴影 ...

  3. 20170617xlVBA调查问卷基础数据分类计数

    Public Sub GatherDataPicker() Application.ScreenUpdating = False Application.DisplayAlerts = False A ...

  4. 第一个 MVC 应用程序(上半部分)(《精通 ASP.NET MVC5》 的第二章)

    本章将使用 ASP.NET MVC 框架创建一个简单的数据录入应用程序. 笔者会将过程分解成一个个的步骤,以便能够看出如何构造 ASP.NET MVC 应用程序.(对于一些未进行解释的内容,笔者提供了 ...

  5. OAF中为MessageTextInput添加加事件处理

    需求:现在OAF页面上有俩输入框,单价,数量,根据单价数量,自动计算MessageStyledText金额中的值,对应的基于EO的VO的字段为UnitPrice,Quantity,Total. 实现方 ...

  6. Sql Server约束的学习一(主键约束、外键约束、唯一约束)

    一.约束的分类 1.实体约束 实体约束是关于行的,比如某一行出现的值不允许出现在其他行,例如主键约束. 2.域约束 域约束是关于列的,对于所有行,某一列有那些约束,例如检查约束. 3.参照完整性约束 ...

  7. duilib 实现列表头任意拖动

    1.表头(xml) <List name="List_records" padding="5,10,5,5" bkcolor="#FFFFFFF ...

  8. simulate mdns message

    use dns-sd command simulate mdns message: dns-sd -R test _test._tcp local 1234 a=1111111111111111111 ...

  9. vue-router如何做历史返回提示?

    获取vue-router的上一个页面是否存在或者是否是自己需要返回的地址,可以使用vue-router的的声明周期函数,有三种模式: 第一种.使用全局函数beforeEach,直接来获取form.pa ...

  10. hdu6153

    题解: EX_KMP 先计算出ex数组 然后ans统计前缀 然后乘一下就好了 代码: #include<cstdio> #include<cmath> #include< ...