来自FallDream的博客,未经允许,请勿转载,谢谢。


婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的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的余数。

直接矩阵乘法貌似可以卡过  看评测机速度233

但是发现你只要记下ans=a*x+b 的a和b就行了 ,这样操作数量减少了一半,500ms左右就能过

讲讲正解 先考虑一行  假设m=4,x是首项,那么F[m]= a(a(a(x)+b)+b)+b 发现F[m]是一个等比数列加上一个 a^(m-1)*x .直接套用等比数列求和公式即可。

再考虑n,发现我可以把前面那个式子同样表示成Ax+B的形式,然后每次跳一行只是乘上C再加上D罢了,同样可以表示成等比数列 所以用同样的方法就可以解出答案

注意特判比为1的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 1000000007
#define getchar() (*S++)
char BB[<<],*S=BB;
using namespace std;
inline int read()
{
int x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= '')x = (x<<)+(x<<) + ch - '',ch = getchar();
return x;
} char n[],m[];
int a,b,c,d,A=,B=,C=,D=,len1=,len2=,ans=; int pow(int x,int k,int P)
{
int sum=;
for(;k;k>>=,x=1LL*x*x%P)
if(k&) sum=1LL*sum*x%P;
return sum;
} int main()
{
fread(BB,,<<,stdin);
do n[++len1]=getchar(); while(n[len1]!=' ');--len1;
do m[++len2]=getchar(); while(m[len2]!=' ');--len2;
a=read();b=read();c=read();d=read();
for(register int i=;i<=len2;++i)
A=(1LL*A*+m[i]-'')%(mod-),
B=(1LL*B*+m[i]-'')%mod;
if(a==) A=,B=1LL*(B+mod-)*b%mod;
else B=1LL*b*((pow(a,A+mod-,mod)+mod-)%mod)%mod*pow(a-,mod-,mod)%mod,A=pow(a,A+mod-,mod);
ans=(1LL*A+B)%mod;
for(register int i=;i<=len1;++i)
C=(1LL*C*+n[i]-'')%(mod-),
D=(1LL*D*+n[i]-'')%mod;
c=1LL*A*c%mod,d=(1LL*A*d%mod+B)%mod;
if(c==) ans=(ans+1LL*(D+mod-)*d%mod)%mod;
else ans=(1LL*d%mod*((pow(c,C+mod-,mod)+mod-)%mod)%mod*pow(c-,mod-,mod)%mod+1LL*ans*pow(c,C+mod-,mod)%mod)%mod;
printf("%d\n",ans);
return ;
}

最新文章

  1. 今天第一次接触到typescript,看了第一个知识点就是变量的声明,来回忆回忆,做做笔记
  2. 使用log4j配置不同文件输出不同内容
  3. Java基础知识学习(六)
  4. imfong.com,我的新博客地址
  5. Stanford机器学习笔记-1.线性回归
  6. asp.net mvc页面javascript代码中如何使用razor
  7. Cheatsheet: 2013 08.14 ~ 08.19
  8. TortoiseSVN期望文件系统格式在“1”到“6”之间;发现格式“7”
  9. 自己写jstl标签解析long时间
  10. Error inflating class android.support.v7.widget.Toolbar
  11. 【编程技巧】alert vs Ext.Msg.alert
  12. Shiro源码分析之SecurityManager对象获取
  13. Redtiger SQL注入练习(一)
  14. CentOs7 最小安装版安装后配置和java环境的搭建
  15. 论文阅读笔记四十五:Region Proposal by Guided Anchoring(CVPR2019)
  16. java详细剖析
  17. Mysql AVG() 值 返回NULL而非空结果集
  18. Java基于opencv实现图像数字识别(三)—灰度化和二值化
  19. VMware中某个虚拟机卡死,单独关闭某个虚拟机的办法
  20. 020_nginx禁止ip默认参数是$remote_addr无法禁止真实ip的问题

热门文章

  1. 201621123031 《Java程序设计》第1周学习总结
  2. tornado web高级开发项目
  3. java克隆之深拷贝与浅拷贝
  4. 我的PCB电路设计(一)
  5. 优化从 App.config 读取配置文件
  6. Mego开发文档 - 数据库建模
  7. cookieUtil
  8. 使用 vi 命令
  9. Python基础学习篇章四
  10. 生成git私钥