BZOJ3240 [Noi2013]矩阵游戏
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
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的余数。
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
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
正解:费马小定理+快速幂+递推公式
解题报告:
大多数题解写的都是矩乘+快速幂的,感觉不用那么麻烦,只需要一点点高一课堂上讲过的推出递推式子就可以了。
推导过程其实挺简单的,就是根据那个式子,先推导出f[i,m]和f[i,1]的关系,然后得到f[i+1,1],再根据新的式子得到f[n+1,1]和f[1,1]的关系,反推得到f[n,m]即可。
具体推导的话直接复制别人的了,很详细:(参考博客链接:http://www.cnblogs.com/iiyiyi/p/5617598.html)
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
const int inf = (<<);
const int MAXN = ;
const int mod = ;
const int MOD = ;
int n,m,len;
int k1[],k2[];
int mi[]={,,,,,,,,};
char ch[MAXN];
LL a,b,c,d,A,B,ans,ans2,C,D;
//A=c*a^(m-1)
//B=( ( b*c*(a^(m-1)-1) ) / (a-1) )+d inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
}
inline LL fastpow(LL x,LL y){
if(x== || y==) return ;
LL base=x,r=;
while(y>) {
if(y&) r*=base,r%=mod;
base*=base; base%=mod; y>>=;
}
return r;
}
inline LL ni(LL x){ return fastpow(x,mod-); }
inline LL fastpow_m(){
LL res=; LL mm=;//对指数取模
for(int i=;i<=m;i++) res+=mm*k2[i]%(mod-),mm*=MOD,mm%=(mod-),res%=(mod-);
return fastpow(a,res);
/*
LL r=1,base=a;
while(m) {
if(k2[1]&1) r*=base,r%=mod;
base*=base; base%=mod;
for(int i=m;i>=1;i--) {
if(k2[i]&1) k2[i-1]+=MOD;
k2[i]>>=1;
}
while(k2[m]==0 && m>0) m--;
}
return r;*/
} inline LL fastpow_n(LL di){
LL res=; LL mm=;//对指数取模
for(int i=;i<=n;i++) res+=mm*k1[i]%(mod-),mm*=MOD,mm%=(mod-),res%=(mod-);
return fastpow(di,res);
/*
LL r=1,base=di;
while(n) {
if(k1[1]&1) r*=base,r%=mod;
base*=base; base%=mod;
for(int i=n;i>=1;i--) {
if(k1[i]&1) k1[i-1]+=MOD;
k1[i]>>=1;
}
while(k1[n]==0 && n>0) n--;
}
return r;*/
} inline void getAB(){
A=fastpow_m(); A*=ni(a); A%=mod; //A=a^(m-1)
B=A; B--; B*=b; B%=mod; B*=c; B%=mod;
B*=ni(a-); B%=mod; B+=d; B%=mod; A*=c; A%=mod;
} inline void over(){
ans-=d; ans+=mod; ans%=mod; ans*=ni(c); ans%=mod;
printf("%lld",ans);
} inline void work(){
scanf("%s",ch); len=strlen(ch); n=; int now=;
int gi=;
for(int i=len-;i>=;i--) {
now=now+(ch[i]-'')*mi[gi];//!!!
gi++;
if(now>=MOD || gi>=) {
gi=;//!!!
k1[n]+=now%MOD;
k1[++n]=now/MOD;
now=;//!!!
}
}
k1[n]+=now; while(k1[n]==) n--; scanf("%s",ch); len=strlen(ch); m=; now=;
gi=;
for(int i=len-;i>=;i--) {
now=now+(ch[i]-'')*mi[gi]; gi++;
if(now>=MOD || gi>=) {
gi=;
k2[m]+=now%MOD;
k2[++m]=now/MOD;
now=;
}
}
k2[m]+=now; while(k2[m]==) m--;
a=getint(); b=getint(); c=getint(); d=getint();
if(a!=) {
getAB();
if(A!=) {
ans=fastpow_n(A); ans%=mod;
ans2=ans-; ans2+=mod; ans2%=mod; ans2*=B; ans2%=mod;
ans2*=ni(A-); ans2%=mod; ans+=ans2; ans%=mod;
}
else{//特判A==1
LL res=,mm=; for(int i=;i<=n;i++) res+=mm*k1[i]%mod,mm*=MOD,mm%=mod,res%=mod;
ans=res*B; ans++; ans%=mod;
}
over();
}
else {
D=c*b; D%=mod; LL res=,mm=;
for(int i=;i<=m;i++) res+=mm*k2[i]%mod,mm*=MOD,mm%=mod,res%=mod;
res--; res+=mod; res%=mod; D*=res; D%=mod; D+=d; D%=mod;
if(c==) {
res=; mm=; for(int i=;i<=n;i++) res+=mm*k1[i]%mod,mm*=MOD,mm%=mod,res%=mod;
D*=res; D%=mod; ans=D+;
over();
}
else{
C=fastpow_n(c);
ans=C; C-=; C*=ni(c-); C%=mod;
ans+=D*C; ans%=mod;
over();
}
}
} int main()
{
work();
return ;
}
BZOJ3240 [Noi2013]矩阵游戏的更多相关文章
- BZOJ3240 [Noi2013]矩阵游戏 矩阵 快速幂 卡常
原文链接http://www.cnblogs.com/zhouzhendong/p/8084891.html 题目传送门 - BZOJ3240 题意概括 F[1][1]=1F[i,j]=a*F[i][ ...
- BZOJ3240 NOI2013矩阵游戏(数论)
必修五题. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cmath> ...
- 题解【bzoj3240 [NOI2013]矩阵游戏】
挖坑2333 等我把代码写完了再写
- bzoj3240 [Noi2013]矩阵游戏——费马小定理+推式子
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3240 n 和 m 太过巨大,不难想到应该用费马小定理什么的来缩小范围: 总之就是推式子啦,看 ...
- 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 3240: [Noi2013]矩阵游戏
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec M ...
- P1397 [NOI2013]矩阵游戏(递推)
P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...
随机推荐
- 布局 - panel
panel一般作为其他组件的容器使用 很多组件都继承自panel 对于面板中的内容,支持异步从后台加载,当然,作为纯粹的面板,一般不会用到这个,但他的子类对于这个功能还是蛮实用的 <%@ tag ...
- android错误之MediaPlayer用法的Media Player called in state *,androidmediaplayer
用到Media Player,遇到几个问题,记一下 用法就不说了,使用的时候最好参考一下mediaPlayer的这张图 第一个错误是Media Player called in state 8 这个是 ...
- Linux execve函数簇用法
exec函数簇实现的功能都是用一个新程序替换原来的程序,替换的内容包括堆栈段,代码段,进程控制器PCD,但是原进程的PID保持不变 int execl(const char *path, const ...
- 0 bug 读后感
本书全名是 <0 bug- C/C++商用工程之道>,这是一本有争议的书,豆瓣链接: http://book.douban.com/subject/4149139/ ,建议有一些商用的开发 ...
- 如何重现难以重现的bug
生活中有这么一种现象:如果你关注某些东西,它就会经常出现在你眼前,例如一个不出名的歌手的名字,一种动物的卡通形象,某个非常专业的术语,等等等等.这种现象也叫做“孕妇效应”.还有类似的一种效应叫做“视网 ...
- lecture11-hopfiled网络与玻尔兹曼机
Hinton课程第11课 这部分的课程算是个知识背景,讲述RBM的来源吧,毕竟是按照hopfield--BM-RBM的路线过来的. 因为水平有限,都是直译,如果纠结某句话,肯定看不懂,所以这些课程只需 ...
- 你误解 .net 了吗?
我现在发现很多人对C#还存在很大的误解,例如C#是完全封闭的,C#不能跨平台,C#性能很差,C#不支持指针等等,持以上观点的人非常多,甚至最近看到的国内某机构对开发语言的统计中还写着C#不跨平台,不开 ...
- 收藏Javascript中常用的55个经典技巧
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...
- Ceph Zabbix plugin 插件和模板
由于Ceph项目中的 Celemeter 缺乏告警功能和监控平台的统一性要求, YY 云平台Ceph集群的监控需求,都是在团队已有的zabbix平台基础上开发完成的. 在已有的git开源项目基础上做了 ...
- [转] java中int,char,string三种类型的相互转换
原文地址:http://blog.csdn.net/lisa0220/article/details/6649707 如何将字串 String 转换成整数 int? int i = Integer.v ...