http://www.lydsy.com/JudgeOnline/problem.php?id=3240 (题目链接)

题意$${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)}$$

  求解${F[n][m]}$,${a,b,c,d}$为常数。

Solution

  原来费马小定理对于矩阵乘法同样适用。。设a为一矩阵,p为质数则:

  正好这里的模数1000000007为质数,那么把n,m模上(p-1)后进行矩阵快速幂即可。用来优化的矩阵很好构造,记得特判a和c等于1的情况。

细节

  注意如果重载了*,不要弄错了乘法的顺序,因为矩阵乘法是不满足交换律的。

代码

// bzoj3240
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#define MOD 1000000007
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std; char s1[1000010],s2[1000010];
LL n,m,a,b,c,d; struct data {
LL x[3][3];
friend data operator * (const data &a,const data &b) {
data tmp;tmp.x[0][1]=tmp.x[0][2]=tmp.x[0][0]=tmp.x[1][0]=tmp.x[2][0]=0;
for (int i=1;i<=2;i++)
for (int j=1;j<=2;j++) {
tmp.x[i][j]=0;
for (int k=1;k<=2;k++) tmp.x[i][j]=(tmp.x[i][j]+a.x[i][k]*b.x[k][j])%MOD;
}
return tmp;
}
}A,B,T,ans,res;
void power(data a,int b) {
ans.x[1][1]=1;ans.x[1][2]=0;ans.x[2][1]=0;ans.x[2][2]=1;
while (b) {
if (b&1) ans=a*ans;
b>>=1;
a=a*a;
}
}
int main() {
scanf("%s%s%lld%lld%lld%lld",s1,s2,&a,&b,&c,&d);
A.x[1][1]=a;A.x[1][2]=0;A.x[2][1]=b;A.x[2][2]=1;
B.x[1][1]=c;B.x[1][2]=0;B.x[2][1]=d;B.x[2][2]=1;
T.x[1][1]=1;T.x[1][2]=1;T.x[2][1]=T.x[2][2]=0;
LL P=MOD-1;
if (a==1 && c==1) P=MOD;
int l=strlen(s1);
for (int i=0;i<l;i++) n=(n*10+s1[i]-'0')%P;
l=strlen(s2);
for (int i=0;i<l;i++) m=(m*10+s2[i]-'0')%P;
power(A,m-1);
for (int i=1;i<=2;i++)
for (int j=1;j<=2;j++) A.x[i][j]=res.x[i][j]=ans.x[i][j];
A=A*B;
power(A,n-1);
res=ans*res;
res=T*res;
printf("%lld",res.x[1][1]);
return 0;
}

  

【bzoj3240】 Noi2013—矩阵游戏的更多相关文章

  1. BZOJ3240 [Noi2013]矩阵游戏

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

  2. BZOJ3240 [Noi2013]矩阵游戏 矩阵 快速幂 卡常

    原文链接http://www.cnblogs.com/zhouzhendong/p/8084891.html 题目传送门 - BZOJ3240 题意概括 F[1][1]=1F[i,j]=a*F[i][ ...

  3. BZOJ3240 NOI2013矩阵游戏(数论)

    必修五题. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cmath> ...

  4. 题解【bzoj3240 [NOI2013]矩阵游戏】

    挖坑2333 等我把代码写完了再写

  5. bzoj3240 [Noi2013]矩阵游戏——费马小定理+推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3240 n 和 m 太过巨大,不难想到应该用费马小定理什么的来缩小范围: 总之就是推式子啦,看 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. DirectoryBrowserMiddleware中间件如何呈现目录结构

    DirectoryBrowserMiddleware中间件如何呈现目录结构 和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义 ...

  2. QT 文件操作

    QT提供了QFile类用于文件读写 QFile可以读写文本文件,也可以读写二进制文件 #include "widget.h" #include <QGridLayout> ...

  3. C#并发编程经典实例--笔记

    一.简介   --并发         同时做多件事情 --多线程         并发的一种形式,它采用多个线程来执行程序.             **如非必要,代码里不要出现 "new ...

  4. Linux设置环境变量(解决许多命令找不到)

    不知道服务器被谁给改坏了,许多命令都不能使用找不到,但是可以在/usr/bin/,/usr/local/bin等里面找到源程序,当时首先想到的就是环境变量,因为Windows在设置了环境变量之后就可以 ...

  5. Theano2.1.10-基础知识之循环

    来自:http://deeplearning.net/software/theano/tutorial/loop.html loop 一.Scan 一个递归的通常的形式,可以用来作为循环语句. 约间和 ...

  6. favicon.ico文件简介

    本地调试时,控制台经常会打印如下的错误(对 favicon.ico 的请求在 chrome 调试面板下不可见,可在抓包工具,比如 Fiddler 中看到): favicon.ico 是啥?看下面这张图 ...

  7. 微信公众平台开发(71)OAuth2.0网页授权

    微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使 ...

  8. 奇怪的Js时间计算方法,跨多个月后出现1天的误差

    在项目中要求用计算两个时间相差的天数,通俗的说就是两个时间 相减, 我的方法 先把两个时间转成相应的毫秒,相减后,再除以(1000 * 60 * 60 * 24) 就可以得到对应天数,但天数会比实际少 ...

  9. DirectX11 SDK 例程报错解决方法

    下载好DirectX11例程后,VS2015运行不起来,好几个报错 在这里记录一下,虽然挺简单的,但是我想对于像我这样的新手小伙伴们来说还是挺有用的 第一个错误: FXC : error X3501: ...

  10. 前端人员一定要掌握的PS技巧

    一.PS与前端知多少 一般我们会认为PS是用来修改图片的,这些工作是美工人员做的事不是前端人员做的,其实这样想你就错了,因为在前端人员也是要学会一些简单的关于PS的技巧的,这样就不会应为一点点小小的需 ...