BZOJ 3240 矩阵游戏
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 矩阵游戏的更多相关文章
- [BZOJ]1059 矩阵游戏(ZJOI2007)
虽然说是一道水题,但小C觉得还是挺有意思的,所以在这里mark一下. Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白 ...
- BZOJ 1059 矩阵游戏
Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个\(N \times N\)黑白方阵进行(如同国际象棋一般,只是颜色是随意的). ...
- BZOJ 1059 矩阵游戏 二分图匹配
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1059 题目大意: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏 ...
- BZOJ [ZJOI2007]矩阵游戏(二分图匹配)
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6390 Solved: 3133[Submit][Stat ...
- 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)* ...
- [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...
- 【BZOJ】【3240】【NOI2013】矩阵游戏
十进制快速幂+矩阵乘法+常数优化 听说这题还可以强行算出来递推式……然后乘乘除除算出来…… 然而蒟蒻选择了一个比较暴力的做法= = 我们发现这个递推的过程是线性的,所以可以用矩阵乘法来表示,$x=a* ...
- 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 ...
随机推荐
- jQuery 实现上下,左右滑动
前几天的任务:http://t.sina.com.cn/ 的下滑效果. 渐变移动出足够的空白 -> 淡出最后一个 ->渐变移动出足够的空白 我们要做的是向左移动效果.这个效果用时需添加一 ...
- 由 argv引出的main参数 分类: C/C++ 2014-11-08 18:00 154人阅读 评论(0) 收藏
我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...
- (转载)linux那点事儿(上)
原文地址:http://www.cnblogs.com/fnng/archive/2012/03/19/2407162.html 本文只是转载供自己学习之用 本文算是学linux的学习笔记吧!其实li ...
- CentOS 6.3 源码安装LAMP(Linux+Apache+Mysql+Php)环境
一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而>言都是在它所 ...
- Writing Your First Test
Let's say you have an activity layout that represents a welcome screen: <?xml version="1.0&q ...
- Java中Date各种相关用法
Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=Calendar.getInstance(); time.clear(); time.set ...
- android如何获取手机型号和版本号
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView ...
- SDK Manager.exe 无法启动,一闪而过的解决办法
删掉 C:\Windows\system32\ 下的 java.exe.javaw.exe.javaws.exe 即可解决.(转载)
- Spring通过SchedulerFactoryBean实现调度任务的配置
http://blog.csdn.net/hu_shengyang/article/details/19815201(里面是配置) 介绍SchedulerFactoryBean http://blog ...
- 添加Pods后,import无提示的解决办法
选择工程的 Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"$(PODS_ROOT)" ...