【BZOJ】【3240】【NOI2013】矩阵游戏
十进制快速幂+矩阵乘法+常数优化
听说这题还可以强行算出来递推式……然后乘乘除除算出来……
然而蒟蒻选择了一个比较暴力的做法= =
我们发现这个递推的过程是线性的,所以可以用矩阵乘法来表示,$x=a*x+b$这样一个递推式我们可以这样表示:$$\begin{bmatrix} x& 1 \end{bmatrix} * \begin{bmatrix} a& 0 \\ b& 1 \end{bmatrix} $$
那么我们可以令$s_1$表示×a+b,$s_2$表示×c+d,那么我们有$$ans=v * ( ({s_1}^{n-1}*s_2)^{m-1} * {s_1}^{n-1} )$$
然而直接算我给TLE了……
下面说一下常数优化:
我们注意到矩阵乘法的时候有:$$\begin{bmatrix} a& 0 \\ b& 1 \end{bmatrix} * \begin{bmatrix} c& 0 \\ d& 1 \end{bmatrix} = \begin{bmatrix} a*c& 0 \\ a*d+b& 1 \end{bmatrix}$$
也就是说:第二列的0和1是一直不动的……那么我们可以将大部分$O(n^3)$的矩阵乘法过程优化到$O(n^2)$。
这里我们${s_1}^{n-1}$出现了两次,那么我们可以用一个中间变量先存下来,可以减少一次运算(毕竟整个算法的主要部分就是在算这几个power)
/**************************************************************
Problem: 3240
User: Tunix
Language: C++
Result: Accepted
Time:7980 ms
Memory:3232 kb
****************************************************************/ //BZOJ 3240
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=1e6+,INF=~0u>>,P=1e9+;
typedef long long LL;
/******************tamplate*********************/ struct Matrix{
int v[][];
Matrix(int x=){F(i,,)F(j,,)if(i==j)v[i][j]=x;else v[i][j]=;}
int* operator [] (int x){return v[x];}
}s1,s2,v;
inline Matrix operator * (Matrix a,Matrix b){
Matrix c;
if (a[][]== && a[][]== && b[][]== && b[][]==){
c[][]=(LL)a[][]*b[][]%P;
c[][]=;
c[][]=((LL)a[][]*b[][]+(LL)a[][])%P;
c[][]=;
return c;
}
F(k,,) F(i,,) F(j,,)
c[i][j]=((LL)c[i][j]+(LL)a[i][k]*b[k][j]%P)%P;
return c;
}
inline Matrix Pow(Matrix a,int b){
Matrix c();
F(i,,b) c=c*a;
return c;
}
inline Matrix Power(Matrix a,char* s){
Matrix r(); int l=strlen(s);
D(i,l-,){
if (s[i]-'') r=r*Pow(a,s[i]-'');
a=Pow(a,);
}
return r;
}
char n[N],m[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("3240.in","r",stdin);
freopen("3240.out","w",stdout);
#endif
scanf("%s",n); scanf("%s",m);
int l1=strlen(n)-;
while(n[l1]=='') n[l1--]='';
n[l1]--;
l1=strlen(m)-;
while(m[l1]=='') m[l1--]='';
m[l1]--;
// printf("%s %s\n",n,m);
int a,b,c,d;
a=getint(); b=getint(); c=getint(); d=getint();
v[][]=v[][]=; v[][]=v[][]=;
s1[][]=a; s1[][]=; s1[][]=b; s1[][]=;
s2[][]=c; s2[][]=; s2[][]=d; s2[][]=;
Matrix s3=Power(s1,m);
v=v*(Power(s3*s2,n)*s3);
printf("%d\n",v[][]);
return ;
}
3240: [Noi2013]矩阵游戏
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 890 Solved: 390
[Submit][Status][Discuss]
Description
婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的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的余数。
Input
一行有六个整数n,m,a,b,c,d。意义如题所述
Output
包含一个整数,表示F[n][m]除以1,000,000,007的余数
Sample Input
Sample Output
HINT
样例中的矩阵为:
1 4 7 10
26 29 32 35
76 79 82 85
1<=N,M<=10^1000 000,a<=a,b,c,d<=10^9
Source
【BZOJ】【3240】【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 [Noi2013]矩阵游戏 ——费马小定理 快速幂
发现是一个快速幂,然而过不去. 怎么办呢? 1.十进制快速幂,可以用来练习卡时. 2.费马小定理,如果需要乘方的地方,可以先%(p-1)再计算,其他地方需要%p,所以需要保存两个数. 然后就是分类讨论 ...
- (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec M ...
- 【BZOJ】3240: [Noi2013]矩阵游戏
题意 给出\(n, m(1 \le n, m \le 10^{1000000})\),求\(f(n, m) \ \mod \ 10^9+7\) $$\begin{cases}f(1, 1) = 1 \ ...
- 3240: [Noi2013]矩阵游戏
Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...
- P1397 [NOI2013]矩阵游戏(递推)
P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...
- bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1891 Solved: 919[Submit][Statu ...
- BZOJ 1059 [ZJOI2007]矩阵游戏
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2707 Solved: 1322[Submit][Stat ...
随机推荐
- Mongodb C#客户端数据关联数据,使用Linq语法进行关联
在Mongodb C# drivers 文档 官方地址:https://docs.mongodb.com/ecosystem/drivers/csharp/ 基础的使用请参考<c# Mongod ...
- Ionic入门二:网格(Grid)页面布局
ionic 的网格(Grid)和其他大部分框架有所不同,它采用了弹性盒子模型(Flexible Box Model) .而且在移动端,基本上的手机都支持.row 样式指定行,col 样式指定列. 1. ...
- MXNet 中的几个数据集
from mxnet import gluon def transform(data, label): return data.astype('float32') / 255., label.asty ...
- Python面向对象中super用法与MRO机制
1. 引言 最近在研究django rest_framework的源码,老是遇到super,搞得一团蒙,多番查看各路大神博客,总算明白了一点,今天做一点总结. 2. 为什么要用super 1)让代码维 ...
- quote函数什么意思,怎么用
转自: https://blog.csdn.net/qiqiyingse/article/details/70046543 quote函数 属于urllib库里面的一个函数 屏蔽特殊的字符.比如如果u ...
- 使用IIS实现反向代理
IIS的反向代理是通过ARR模块来完成的,ARR模块需要另外安装,而且只能通过Web PlatForm Installer安装.关于安装来源与步骤,帖子已有很多,不做描述.启用“Application ...
- [ZHOJ1956]vfk的地雷
题目大意: 有$n$个开关,$r$句话. 每个开关$i$有$p_i$的概率被触发,并造成$d_i$的代价. 每个开关至多被触发一次,一句话至多触发一个开关. 每个开关按照顺序被尝试触发. 求期望代价. ...
- 216. 组合总和 III
216. 组合总和 III 题意 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的 ...
- VC/MFC分割字符串(SplitString)返回CStringArray
引自:http://bbs.csdn.net/topics/60321228 原版: CStringArray* SplitString(CString string, char pattern) { ...
- Codeforces Beta Round #11 B. Jumping Jack 数学
B. Jumping Jack 题目连接: http://www.codeforces.com/contest/11/problem/B Description Jack is working on ...