Description

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

\(F[1][1]=1\)

\(F[i,j]=a \times F[i][j-1]+b (j \ne 1)\)

\(F[i,1]=c \times F[i-1][m]+d (i \ne 1)\)

递推式中\(a,b,c,d\)都是给定的常数。

现在婷婷想知道\(F[n][m]\)的值是多少,请你帮助她。由于最终结果可能很大,你只需要输出\(F[n][m]\)除以\(1000000007\)的余数。

Input

一行有六个整数\(n,m,a,b,c,d\)。意义如题所述

Output

包含一个整数,表示\(F[n][m]\)除以\(1000000007\)的余数

Sample Input

3 4 1 3 2 6

Sample Output

85

HINT

样例中的矩阵为:



\(1 \le N,M \le 10^{1000 000},1 \le a,b,c,d \le 10^9\)

首先可以肯定这题肯定是矩阵乘法。

由递推式\(F[i,j]=a \times F[i][j-1]+b (j \ne 1)\)我们可以得到这样一个矩阵乘法:



由递推式\(F[i,1]=c \times F[i-1][m]+d (i \ne 1)\)我们可以得到这样一个矩阵乘法:

但是数据范围坑爹,所以我们不能用二进制的快速幂(高精度除以\(2\)会TLE)。我们转变一下,直接使用十进制的快速幂(太神了),这样就减少了除法的时间。

题目卡常数(我大战常数两小时),矩阵我都是手推的。

#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std; typedef long long ll;
#define maxn (1000010)
#define rhl (1000000007)
char s[maxn]; int A,B,C,D;
struct Matrix
{
ll s[2][2]; short a,b;
inline Matrix() { memset(s,0,sizeof(s)); }
}M1,M2;
struct bignum
{
short a[maxn];int l;
inline void read()
{
scanf("%s",s); l = strlen(s);
for (int i = l;i;--i) a[i] = s[i-1]-'0';
}
inline void dec()
{
a[l]--;
for (int i = l;i;--i) { if (a[i] < 0) a[i-1]--,a[i] += 10; else break; }
if (a[1] == 0) { for (int i = 2;i <= l;++i) a[i-1] = a[i]; a[l--] = 0; }
}
}n,m; inline Matrix times(const Matrix &x,const Matrix &y)
{
Matrix ret; ret.a = x.a; ret.b = y.b;
if (ret.a == 1)
{
ret.s[0][0] = x.s[0][0]*y.s[0][0]+x.s[0][1]*y.s[1][0];
if (ret.s[0][0] >= rhl) ret.s[0][0] %= rhl;
ret.s[0][1] = 1;
}
else
{
ret.s[0][0] = x.s[0][0]*y.s[0][0]+x.s[0][1]*y.s[1][0];
ret.s[1][0] = x.s[1][0]*y.s[0][0]+x.s[1][1]*y.s[1][0];
if (ret.s[0][0] >= rhl) ret.s[0][0] %= rhl;
if (ret.s[1][0] >= rhl) ret.s[1][0] %= rhl;
ret.s[1][1] = 1;
}
return ret;
} inline Matrix ksm(Matrix a,int b)
{
Matrix ret; ret.a = ret.b = 2;
ret.s[0][0] = ret.s[1][1] = 1;
for (;b;b >>= 1,a = times(a,a)) if (b & 1) ret = times(ret,a);
return ret;
} inline Matrix qsm(Matrix a,const bignum &b)
{
Matrix ret; ret.a = ret.b = 2;
ret.s[0][0] = ret.s[1][1] = 1;
for (int i = b.l;i;--i) ret = times(ret,ksm(a,b.a[i])),a = ksm(a,10);
return ret;
} int main()
{
freopen("3240.in","r",stdin);
freopen("3240.out","w",stdout);
n.read(); m.read(); scanf("%d %d %d %d",&A,&B,&C,&D);
n.dec(); m.dec();
Matrix ans,mul;
ans.a = 1; ans.b = 2; ans.s[0][0] = 1; ans.s[0][1] = 1;
M1.a = M2.a = M1.b = M2.b = 2;
M1.s[0][0] = A; M1.s[1][1] = 1; M1.s[1][0] = B;
mul.a = mul.b = 2;
mul.s[0][0] = C; mul.s[1][1] = 1; mul.s[1][0] = D;
M2 = times(qsm(M1,m),mul);
ans = times(ans,qsm(M2,n)); ans = times(ans,qsm(M1,m));
printf("%lld",ans.s[0][0]);
fclose(stdin); fclose(stdout);
return 0;
}

BZOJ 3240 矩阵游戏的更多相关文章

  1. [BZOJ]1059 矩阵游戏(ZJOI2007)

    虽然说是一道水题,但小C觉得还是挺有意思的,所以在这里mark一下. Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白 ...

  2. BZOJ 1059 矩阵游戏

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个\(N \times N\)黑白方阵进行(如同国际象棋一般,只是颜色是随意的). ...

  3. BZOJ 1059 矩阵游戏 二分图匹配

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1059 题目大意: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏 ...

  4. BZOJ [ZJOI2007]矩阵游戏(二分图匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6390  Solved: 3133[Submit][Stat ...

  5. bzoj 3240 矩阵乘法+十进制快速幂

    首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...

  6. [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...

  7. 【BZOJ】【3240】【NOI2013】矩阵游戏

    十进制快速幂+矩阵乘法+常数优化 听说这题还可以强行算出来递推式……然后乘乘除除算出来…… 然而蒟蒻选择了一个比较暴力的做法= = 我们发现这个递推的过程是线性的,所以可以用矩阵乘法来表示,$x=a* ...

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

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

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

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

随机推荐

  1. springboot +spring security4 +thymeleaf 后台管理系统

    需求:一个后台管理系统,现在用的springboot 微框架比较多, 所以这里也使用了, 后台权限用 spring security ,之前以前觉得听复杂 . 后来发现还是蛮简单的, 看了源代码之后. ...

  2. Android教程:ImageView 设置图片

    Android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setImag ...

  3. 08_android入门_android-async-http开源项目介绍及用法

    android-async-http开源项目可以是我们轻松的获取网络数据或者向server发送数据.使用起来很easy,关于android-async-http开源项目的介绍内容来自于官方:http: ...

  4. TCP SOCKET中backlog参数的用途是什么? ---图解

    recv_queue中的包大小,为内核的包大小,而不是ip包大小. 如果发出去的包太大,需要修改write_queue和tx_queue两个参数,tx_queue主要是流量控制. 多进程必须在sock ...

  5. FaceBook要在视频领域打败YouTube?

    据<纽约时报>报道,FaceBook正在探索一项新的策略来直接把音乐视频嵌入到用户的News Feeds中.目前,具有代表性的视频网站有YouTube和Vimeo,它们可以在社交网络上分享 ...

  6. GET和POST本质上有什么区别

    如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...

  7. codevs1024一塔湖图(丧心病狂的建图)

    /* 丧心病狂的最短路 关键是建图 根据题目中给的路 拆出节点来 建图 (i,j) -->(j-1)*n+i 然后根据障碍 把死路 湖覆盖的dis改变成极大值 然后Floyd 然后 然后就没有然 ...

  8. listView中的button控件获取item的索引

    在listview中的listitem设置事件响应,如果listitem中有button控件,这时候listitem就不会捕获到点击事件,而默认的是listitem中的button会捕获点击事件.那么 ...

  9. 最优雅的C++跟lua交互.

    我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写 ...

  10. SGU 194. Reactor Cooling(无源汇有上下界的网络流)

    时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...