我们看到了及其可怕的数据范围

这个样子都没有办法直接读入的数据范围应该怎么算

我们观察一下递推式\(f[i][j]=a*f[i][j]+b(j!=1)\)

\(f[i][1]=c*f[i-1][m]+d\)

转移非常简单,于是可以考虑一下矩阵乘法

如果我们将这个矩阵破坏成一个链,那么就会有这种形式的递推

连续推\(m\)次第一个柿子,之后再推一次第二个柿子,之后反复

重复上面的过程\(n\)次就好了

于是我们可以将连续转移\(m\)次一式的到的矩阵和第二个式子的转移矩阵乘起来,之后将这个矩阵再转移\(n\)次就是答案了

由于\(n,m\)是在太大了,我们又发现模数是质数,于是我们可以利用费马小定理来降幂

则有

\[A^{mod-1}\%mod=1
\]

所以

\[A^m\equiv A^{m\%(mod-1)}(\%\ mod )
\]

至于为什么要特判\(a=1\)

我怎么知道啊

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 5
#define LL long long
const LL mod=1000000007;
char N_[1000005],M_[1000005];
LL n,m,a,b,c,d;
inline LL read()
{
char c=getchar();
LL x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=x*10%(mod-1)+c-48,c=getchar();
return x;
}
struct Mat
{
LL a[4][4],ans[4][4];
inline void did_ans()
{
LL mid[4][4];
for(re int i=1;i<=2;i++)
for(re int j=1;j<=2;j++)
mid[i][j]=ans[i][j],ans[i][j]=0;
for(re int i=1;i<=2;i++)
for(re int j=1;j<=2;j++)
for(re int p=1;p<=2;p++)
ans[i][j]=(ans[i][j]+(a[i][p]*mid[p][j])%mod)%mod;
}
inline void did_a()
{
LL mid[4][4];
for(re int i=1;i<=2;i++)
for(re int j=1;j<=2;j++)
mid[i][j]=a[i][j],a[i][j]=0;
for(re int i=1;i<=2;i++)
for(re int j=1;j<=2;j++)
for(re int p=1;p<=2;p++)
a[i][j]=(a[i][j]+(mid[i][p]*mid[p][j])%mod)%mod;
}
}R,L,K;
inline void mul(Mat &A,Mat &B)
{
LL mid[4][4];
for(re int i=1;i<=2;i++)
for(re int j=1;j<=2;j++)
mid[i][j]=A.ans[i][j],A.ans[i][j]=0;
for(re int i=1;i<=2;i++)
for(re int j=1;j<=2;j++)
for(re int p=1;p<=2;p++)
A.ans[i][j]=(A.ans[i][j]+(mid[i][p]*B.ans[p][j])%mod)%mod;
for(re int i=1;i<=2;i++)
for(re int j=1;j<=2;j++)
A.a[i][j]=A.ans[i][j];
}
int main()
{
scanf("%s%s",N_+1,M_+1);
a=read(),b=read(),c=read(),d=read();
int lenn=strlen(N_+1);
if(a==1)
{
for(re int i=1;i<=lenn;i++) n=n*10%mod+N_[i]-48;
n=(n-2+mod)%mod;
}
else
{
for(re int i=1;i<=lenn;i++) n=n*10%(mod-1)+N_[i]-48;
n=(n-2+mod-1)%(mod-1);
}
lenn=strlen(M_+1);
if(c==1)
{
for(re int i=1;i<=lenn;i++) m=m*10%mod+M_[i]-48;
m=(m-2+mod)%mod;
}
else
{
for(re int i=1;i<=lenn;i++) m=m*10%(mod-1)+M_[i]-48;
m=(m-2+mod-1)%(mod-1);
}
R.a[1][1]=R.ans[1][1]=1;
R.a[2][1]=R.ans[2][1]=b;
R.ans[2][2]=R.a[2][2]=a;
R.ans[1][2]=R.a[1][2]=0;
K=R;
while(m)
{
if(m&1) R.did_ans();
m>>=1;
R.did_a();
}
L.a[1][1]=L.ans[1][1]=1;
L.a[2][1]=L.ans[2][1]=d;
L.a[2][2]=L.ans[2][2]=c;
L.ans[1][2]=L.a[1][2]=0;
mul(L,R);
while(n)
{
if(n&1) L.did_ans();
n>>=1;
L.did_a();
}
printf("%lld",((L.ans[2][1]+L.ans[2][2])%mod*R.ans[2][2]%mod+R.ans[2][1])%mod);
return 0;
}

【[NOI2013]矩阵游戏】的更多相关文章

  1. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  2. BZOJ 3240: [Noi2013]矩阵游戏

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1586  Solved: 698[Submit][Status ...

  3. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 123   Solved: 73 [ Submit][ St ...

  4. (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  M ...

  5. P1397 [NOI2013]矩阵游戏(递推)

    P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...

  6. 【bzoj3240】 Noi2013—矩阵游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3240 (题目链接) 题意$${F[1][1]=1}$$$${F[i][j]=a*F[i][j-1]+ ...

  7. BZOJ3240 [Noi2013]矩阵游戏

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  8. 3240: [Noi2013]矩阵游戏

    Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...

  9. NOI2013矩阵游戏

    Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...

  10. 洛谷P1397 [NOI2013]矩阵游戏

    矩阵快速幂+费马小定理 矩阵也是可以跑费马小定理的,但是要注意这个: (图是盗来的QAQ) 就是说如果矩阵a[i][i]都是相等的,那么就是mod p 而不是mod p-1了 #include< ...

随机推荐

  1. oracle12C--DG搭建配置

    一,主库前期操作 搭建的话和11g差不多,点点点. 两台服务器,一台主库,一台从库 01,配置主库hosts cat /etc/hosts 192.168.0.31 node12c01 192.168 ...

  2. spring-data-elasticsearch使用笔记

    使用spring-data遇到了一些问题,记录一下. spring-data-elasticsearch版本选择 这里有一份官方github上的spring-data-elasticsearch与el ...

  3. 2018湖湘杯web、misc记录

    1.题目名 Code Check 打开题目,右键发现有id参数的url,简单base64解码以后发现不是明文,说明利用了其他的加密方式,那么应该会有具体的加密方式给我们,于是试试常见的文件泄露,可以发 ...

  4. [转].NET Core之Entity Framework Core 你如何创建 DbContext

    本文转自:http://www.cnblogs.com/tdws/p/5874212.html 本文版权归博客园和作者吴双共同所有,欢迎转载,转载和爬虫请注明博客园蜗牛原文地址 http://www. ...

  5. 如何给swing加上alt+x和ctrl+x快捷键

    1.给菜单栏上的菜单alt+x快捷键非常简单: private JMenu helpInfo = new JMenu("帮助"); helpInfo.setMnemonic(Key ...

  6. FontSize sp 和 dp 的区别

    dp不会随着“设置->显示->字体大小”的改变而改变,sp会. sp会随着configeration的配置来scale, dp不会. 所以,什么时候用sp, 什么时候用dp需要斟酌.

  7. 《Unity Shader入门精要》读书笔记(1)

    主要是对第二章的整理 渲染流水线:由一个三维场景出发,生成(渲染)一张二维图像. 渲染流程:应用阶段.几何阶段.光栅化阶段. 应用阶段: 1. 把数据加载到显存中 渲染所需数据从硬盘,到内存,再到显存 ...

  8. 为 Drupal 7 构建一个新主题

    主题解释了 Drupal 网站的用户界面 (UI).虽然主题结构并没有明显的变化,但 Drupal 版本 7 配备了一个新的主题实现方法.本文演示了如何创建一个新的 Drupal 7 主题. Drup ...

  9. CSS如何设置换行文字自动对齐

    CSS如何设置换行文字自动对齐 如图所示: 代码实现如下: <ul class='warn-page-content'>                <li>         ...

  10. Appcan开发之页面布局与CSS排版(转)

    在Appcan开发中,首先要进行的就是页面布局,然后在这个页面上填充数据,加上互动元素,最终构成完整的应用. 因为appcan是使用HTML5+CSS3+JavaScript技术来进行开发,所以与普通 ...