LG1397 [NOI2013]矩阵游戏
题意
婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的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\)
\left[
\begin{matrix}
1\\
1
\end{matrix}
\right]
\]
列转移矩阵\(A_1\)
\left[
\begin{matrix}
a & b\\
0 & 1
\end{matrix}
\right]
\]
行转移矩阵\(A_2\)
\left[
\begin{matrix}
c & d\\
0 & 1
\end{matrix}
\right]
\]
转移到最后一行,最后一列,应该是
\]
代码
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]矩阵游戏的更多相关文章
- 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列的 ...
- NOI2013矩阵游戏
Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...
随机推荐
- php时区设置 warning: strtotime(): It is not safe to rely on the system's timezone settings
warning: strtotime(): It is not safe to rely on the system's timezone settings warning: strtotime(): ...
- Spring Boot 介绍
Spring Boot 能够让你更加容易创建一个独立启动,产品化的,并且是基于 Spring 的应用程序.我们为 Spring 平台及第三方库提供开箱即用的设置,这样你就可以有条不紊的开始开发,减少在 ...
- Confluence 6 嵌套用户组的备注
潜在的性能影响.启用嵌套用户组可能会减慢用户查找的速度. 在 LDAP 中定义嵌套用户组.在 LDAP 中,一个嵌套用户组是 DN (Distinguished Name)的子用户组,这个字用户组将会 ...
- .net 环境配置
需要把安装中文包也安装上.4个都安装
- ORACLE常见方法使用(转)
1.DBMS_LOB包的使用 2.如何释放DBMS_LOB.CREATETEMPORARY的空间 3.oracle数组
- 隔离级别 && SNAPSHOT
read uncommitted | 0 未提交读 将查询的隔离级别指定为 0. 可以读脏数据. 读脏数据:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据. 例: 公 ...
- OC 对象和函数
#import <Foundation/Foundation.h> @interface Car : NSObject {// 成员变量 @public int wheels; int s ...
- 简话Angular 04 Angular过滤器详解
一句话: filter是万能的数据处理器,可以过滤数据,排序数据,删除数据,扩展数据 1. 内置filter大全 url: https://docs.angularjs.org/api/ng/filt ...
- oracle_sql语句的大全
# 建立数据库struts CREATE DATABASE IF NOT EXISTS struts DEFAULT CHARACTER SET GBK; 1.登录:(管理员)conn sys/p ...
- MatchText MatchStr 区别
区别就是 是否区分大小写. str=字符串,区分 text=文本,不区分 时间长了就忘了. function AnsiCompareText(const S1, S2: string): Intege ...