bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 613 Solved: 256
[Submit][Status]
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
本着NOIP前刷水题的想法做了这道没有数据范围的题,结果发现n,m范围实在是有一点过分了,十进制快速幂不说了,这道题应该是专门在卡普通的O(n^3)矩阵乘法,由于题目中矩阵第二行都没有变,所以说可以借此优化一下常数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MOD 1000000007
#define MAXN 2100000
typedef long long qword;
struct matrix
{
qword a[][];
int n,m;
matrix()
{
memset(a,,sizeof(a));
}
void init0()
{
n=m=;
a[][]=a[][]=;
a[][]=a[][]=;
}
void init1(int aa,int bb)
{
n=m=;
a[][]=aa;
a[][]=bb;
a[][]=;
}
void init2(int aa)
{
n=;m=;
a[][]=aa;
a[][]=;
}
};
inline matrix operator *(matrix m1,matrix m2)
{
int i,j,k;
matrix ret;
ret.n=m1.n;
ret.m=m2.m;
if (ret.n== && ret.m==)
{
if (m1.a[][]!= || m1.a[][]!= || m2.a[][]!= || m2.a[][]!=)
throw ;
ret.a[][]=m1.a[][]*m2.a[][]%MOD;
ret.a[][]=(m1.a[][]*m2.a[][]%MOD+m1.a[][])%MOD;
ret.a[][]=;
ret.a[][]=;
return ret;
}
for (i=;i<m1.n;i++)
{
for (j=;j<m2.m;j++)
{
for (k=;k<m1.m;k++)
{
ret.a[i][j]=(ret.a[i][j]+m1.a[i][k]*m2.a[k][j]%MOD)%MOD;
}
}
}
return ret;
}
matrix pow_mod(matrix a,char *str,int len)
{
int i,j;
register matrix t,l0,ret;
ret.init0();
l0.init0();
t=a;
for (i=len-;i>=;i--)
{
for (j=;j<;j++)
{
if (j==str[i]-'')
ret=ret*l0;
l0=l0*t;
}
t=l0;
l0.init0();
}
return ret;
} char s1[MAXN],s2[MAXN];
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
qword a,b,c,d,i,j,k;
scanf("%s %s%lld%lld%lld%lld",s1,s2,&a,&b,&c,&d);
a%=MOD;b%=MOD;c%=MOD;d%=MOD;
int l1,l2;
l1=strlen(s1);
l2=strlen(s2);
int x;
x=l1-;
s1[x]--;
while (s1[x]<'')
{
s1[x]+=;s1[x-]--;x--;
}
x=l2-;
s2[x]--;
while (s2[x]<'')
{
s2[x]+=;s2[x-]--;x--;
} matrix m1,r1,m2,r2,r3,m3,r4,m4;
matrix t1;
m1.init1(a,b);
m2.init1(c,d);
m4.init2(); r1=pow_mod(m1,s2,l2);
r2=m2*r1; r3=pow_mod(r2,s1,l1);
r4=r1*r3*m4;
cout<<r4.a[][]<<endl;
}
bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化的更多相关文章
- 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 3240 [Noi2013]矩阵游戏 ——费马小定理 快速幂
发现是一个快速幂,然而过不去. 怎么办呢? 1.十进制快速幂,可以用来练习卡时. 2.费马小定理,如果需要乘方的地方,可以先%(p-1)再计算,其他地方需要%p,所以需要保存两个数. 然后就是分类讨论 ...
- Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)
Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...
- Luogu T7152 细胞(递推,矩阵乘法,快速幂)
Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...
- 2019牛客多校B generator 1——十进制快速幂
题目 已知 $x_i = ax_i + bx_{i-1}$,求 $x_n \% MOD$.($1\leq n\leq 10^{(10^6)}$) 分析 写成矩阵快速幂的形式,相当于求转移矩阵的 $n$ ...
- 十进制快速幂(牛客多校第五场)-- generator 1
思路: 十进制快速幂. #include <stdio.h>//sprintf #include <cstdlib>////malloc exit strcat itoa sy ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- 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 ...
随机推荐
- 探索WebKit内核(一)------ 菜鸟起步
为什么搞WebKit 如今研究WebKit的人越来越多,俺不能免俗,也增加当中.WebKit的火爆也是得益于浏览器和WebOS的混战,随着Palm WebOS, Chrome OS, Firefox ...
- JSP内置对象整理(转)
① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上. 方法: 1. void clear() ;清除输出缓冲区的内容,但是不输出到客户端. 2. ...
- Linux下设置最大文件打开数nofile及nr_open、file-max
在开发运维的时候我们常常会遇到类似“Socket/File: Can’t open so many files”,“无法打开更多进程”,或是coredump过大等问题,这些都可以设置资源限制来解决.今 ...
- JDBC操作数据库 封装好的工具类
mysql sqlserver oracle 数据库的驱动jar包http://download.csdn.net/download/csdn576038874/8833683package cn.h ...
- linux tar 压缩解压缩
解压 .tar.bz tar zxvf file.tar.gz .tar.gz2 tar jxvf file.tar.bz2 .bz gzip -d file.bz .gz2 bzip2 -d fil ...
- JS获取图片上传地址
function getObjectURL(file) { var url = null ; if (window.createObjectURL!=undefined) { // basic url ...
- RedHat7安装Sublime Text 3
下载Sublime Text 3 # wget http://c758482.r82.cf2.rackcdn.com/sublime_text_3_build_3083_x64.tar.bz2 解压S ...
- Android源码编译过程之九鼎开发板
build_kernel() { # 进入源码顶层目录 cd ${BS_DIR_KERNEL} || # 编译配置文件 make ${BS_CONFIG_KERNEL} ARCH=arm CROSS_ ...
- java的真相
所谓编译,就是把源代码“翻译”成目标代码——大多数是指机器代码——的过程.针对Java,它的目标代码不是本地机器代码,而是虚拟机代码. 编译原理里面有一个很重要的内容是编译器优化.所谓编译器优化是指, ...
- [上传下载] C#FileDown文件下载类 (转载)
点击下载 FileDown.zip 主要功能如下 .参数为虚拟路径 .获取物理地址 .普通下载 .分块下载 .输出硬盘文件,提供下载 支持大文件.续传.速度限制.资源占用小 看下面代码吧 /// &l ...