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 ...
随机推荐
- JMeter对Oracle数据库进行压力测试
步骤 (1)复制ORACLE的JDBC驱动JAR包文件(ojdbc14.jar)到JMeter的lib目录下. (2)运行jmeter.bat (3)建立线程组:右键测试计划->添加->T ...
- Android with Eclipse - Waiting for HOME ('android.process.acore') to be launched?
mac机中使用命令行方式启动android sdk manager,有需要的朋友可以参考下. 相信使用mac机的用户做android开发都会有一个困惑,就是如何更新android sdk,或者说直接使 ...
- Android studio错误及解决办法
错误: Cannot launch AVD in emulator. Output: emulator: ERROR: GPU emulation is disabled. Only screen s ...
- jquery ajax跨域取数据
jsonp.js/html 主要是利用jquery ajax和jsonp的datatype 跨站点请求数据,记录~ 同源策略:同端口,同协议,同域:所以ajax不能支持跨域取得数据,解决方案一般是js ...
- SQL Server备份还原数据库中的小把戏
备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support 1 media families, but 2 media families are expected ...
- Android 点击事件,4种回调。
1. 继承监听接口. 2. xml方式 : 设置 android:onClick 3. 内部类 4. 匿名类 ------------------------------------------- ...
- APP启动页
关于APP启动引导页面模块 时间:2016年6月14日 作者:赵锐 模块使用说明 模块暴露在外的接口是- (void)showGuideViewWithImages:(NSArray *)images ...
- prmopt 提示框接收字符串,输入后按确定弹出警告框,警告内容为逆序的字符串
虽然已经找到offer,但因为公司还没安排实习,所以在学校的时间多了很多.好吧,这段时间我用来备考四级啦(好悲催,还没过),然后这一天,闲着无聊,就帮妹妹看了这样子一道题目啦. 题目内容: 编制一个从 ...
- PHP发送AT指令
需求: 发送短信到用户输入手机, 要求可以自定义信息内容 问题: 没有电信猫, 使用免费api接口无法自定义短信内容 解决方案: 通过4G网卡, 接在服务器上, 通过AT指令操作网卡, 发送短信 查阅 ...
- ecshop 函数列表大全
lib_time.phpgmtime() P: 获得当前格林威治时间的时间戳 /$0server_timezone() P: 获得服务器的时区 /$0local_mktime($hour = NULL ...