3240: [Noi2013]矩阵游戏

Time Limit: 10 Sec   Memory Limit: 256 MB
Submit: 123   Solved: 73
[ 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

3 4 1 3 2 6

Sample Output

85

HINT

样例中的矩阵为:

1 4 7 10

26 29 32 35

76 79 82 85

Source

NOI赛场上拿了70分(没用费马小定理)

PS:实际原因是没算复杂度囧。。。。

好吧。。。这题让我们回顾一下费马小定理:

a^b mod (phi(p))=1 (mod p)

所以可以mod ,特判a=c=1的特殊情况

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define MAXN (1000000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
ll a,b,c,d,n,m,phiF;
ll getint(char s[]) //_dec_1
{char c;ll x=0;for(int i=0,c=s[i];s[i];c=s[++i]){x=(x*10+c-48)%phiF;}x=(x-1+phiF)%phiF;return x;
}
struct M
{int n,m;ll a[3][3];M(){n=m=2;MEM(a);}M(ll a1,ll a2,ll b1,ll b2){n=m=2;MEM(a) a[1][1]=a1,a[1][2]=a2,a[2][1]=b1,a[2][2]=b2;  }friend M operator*(M a,M b){M c;For(k,2)For(i,2)For(j,2)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%F;/*For(i,2){For(j,2) cout<<c.a[i][j]<<' ';cout<<endl;}*/return c; }void make_I(){n=m=2;MEM(a)For(i,n) a[i][i]=1;}
}A,B,C,D,I;
void print(M a)
{For(i,2){For(j,2) cout<<a.a[i][j]<<' ';cout<<endl;}
}
M pow2(M a,ll b)
{M c=I;static bool a2[MAXN];int n=0;while (b) a2[++n]=b&1,b>>=1;For(i,n){if (a2[i]) c=c*a;a=a*a;}return c;
}
char s1[MAXN],s2[MAXN];
int main()
{scanf("%s%s",s1,s2);scanf("%lld%lld%lld%lld",&a,&b,&c,&d);if (a==1&&c==1) phiF=F;else phiF=F-1;n=getint(s1);m=getint(s2);A=M(a,b,0,1);B=M(c,d,0,1);I=M(1,0,0,1);C=pow2(A,m);//print(C);D=B*C;//print(D);D=pow2(D,n);D=C*D;//print(D);cout<<(D.a[1][2]+D.a[1][1])%F<<endl;return 0;
}

顺便再附一份读文件的特殊写法:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (1000000007)
#define MAXN (1000000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
ll a,b,c,d,n,m,phiF;
ll getint() //_dec_1
{char c;while (c=getchar(),(!isdigit(c)));//cout<<(int)c;ll x=c-48;while (c=getchar(),(isdigit(c))){x=(x*10+c-48)%phiF;}x=(x-1+phiF)%phiF;return x;
}
struct M
{int n,m;ll a[3][3];M(){n=m=2;MEM(a);}M(ll a1,ll a2,ll b1,ll b2){n=m=2;MEM(a) a[1][1]=a1,a[1][2]=a2,a[2][1]=b1,a[2][2]=b2;  }friend M operator*(M a,M b){M c;For(k,2)For(i,2)For(j,2)c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%F;/*For(i,2){For(j,2) cout<<c.a[i][j]<<' ';cout<<endl;}*/return c; }void make_I(){n=m=2;MEM(a)For(i,n) a[i][i]=1;}
}A,B,C,D,I;
void print(M a)
{For(i,2){For(j,2) cout<<a.a[i][j]<<' ';cout<<endl;}
}
M pow2(M a,ll b)
{M c=I;static bool a2[MAXN];int n=0;while (b) a2[++n]=b&1,b>>=1;For(i,n){if (a2[i]) c=c*a;a=a*a;}return c;
}int main()
{freopen("matrix.in","r",stdin);freopen("matrix.out","w",stdout);scanf("%*s%*s");scanf("%lld%lld%lld%lld",&a,&b,&c,&d);if (a==1&&c==1) phiF=F;else phiF=F-1;freopen("matrix.in","r",stdin);n=getint();m=getint();A=M(a,b,0,1);B=M(c,d,0,1);I=M(1,0,0,1);C=pow2(A,m);//print(C);D=B*C;//print(D);D=pow2(D,n);D=C*D;//print(D);cout<<(D.a[1][2]+D.a[1][1])%F<<endl;return 0;
}

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

  1. HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Li ...

  2. HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)

    Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) ...

  3. hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)

    M斐波那契数列                                                                           Time Limit: 3000/1 ...

  4. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)

    题目链接:点击查看 题目大意:给出函数f(x): 现给出n,a,b,c,mod,求f(n)对mod取模后的结果 题目分析:这个题目相对于前几个题来说稍微加大了点难度,但还是挺水的一个题,首先我们可以对 ...

  5. HDU 4549 M斐波那契数列(矩阵快速幂费马小定理)

    ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 T ...

  6. 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)...

    http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,"至少"一词可以给我 ...

  7. 数论杂谈(欧拉定理与费马小定理结论与应用)

    文章目录 欧拉定理: 欧拉定理性质: 扩展欧拉定理: 费马小定理: 指数循环节 费马大定理 逆元: 例题 原根 定义: 原根存在条件 例题 快速幂 代码 矩阵快速幂 原理: 代码: 欧拉定理: aφ( ...

  8. 【牛客 -330E 】Applese 涂颜色(费马小定理,超级快速幂)

    题干: 精通程序设计的 Applese 叕写了一个游戏. 在这个游戏中,有一个 n 行 m 列的方阵.现在它要为这个方阵涂上黑白两种颜色.规定左右相邻两格的颜色不能相同.请你帮它统计一下有多少种涂色的 ...

  9. 三个重要的同余式——威尔逊定理、费马小定理、欧拉定理 + 求幂大法的证明

    一.威尔逊定理 若p为质数,则 p|(p-1)!+1 亦:(p-1)! ≡ p-1 ≡ -1(mod p) 例题: HDU 2973 YAPTCHA (威尔逊定理及其逆定理) 解题报告见http:// ...

最新文章

  1. Active MQ 双主 和 mysql双主 方案测试
  2. 如何搭建一套融资租赁业务系统
  3. Safe or Glitch-Free Clock Gating
  4. 详解JDBC连接数据库
  5. phpnow升级php版本 php-5.2.14-Win32升级至5.3.5
  6. 最少换乘(最短路+恶心的输入)acm寒假集训日记22/1/3 or 22/1/4
  7. javascript最新版本_JavaScript 引擎「V8」发布 8.0 版本,内存占用量大幅下降
  8. tcp状态转换--三次握手/四次挥手
  9. Python基础-3内建函数 type() cmp()
  10. linux arm交叉编译ko,Ubuntu嵌入式交叉编译环境arm-linux-gcc
  11. UITextView自定义placeholder功能:用一个label写了文字,然后当检测到长度不为0的时候就把label隐藏...
  12. 工作总结:将电脑中的ARP缓存清空黑屏命令
  13. 团体程序设计天梯赛-练习集L1-023. 输出GPLT
  14. Intel Optane P4800X评测(序):不用缓存和电容保护的SSD?
  15. 【游戏辅助】利用C语言编写《植物大战僵尸》修改阳光值代码
  16. 基于微信小程序的电影院购票系统丨毕业设计源码
  17. r语言调用python_如何在Rstudio中使用python 语言 (图文详解)
  18. 【数据库查询--电影制片系列】-- 检索出Studio表中制片公司st1的地址。
  19. 硬件工程师成长之路(1)——元件基础
  20. dell服务器开启64位支持,dell服务器虚拟化开启(戴尔bios设置虚拟化)

热门文章

  1. 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统(Part2) 转
  2. 为Web应用建立基于JMX的管理系统
  3. Node-Web模块
  4. hdu4864 贪心
  5. 【数字信号处理】线性常系数差分方程 ( 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 “ 线性时不变系统 “ 案例 | 根据 “ 线性时不变系统 “ 定义证明 )
  6. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
  7. 【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
  8. 【错误记录】Android 文件分享 FileProvider 设置错误
  9. 【Android 内存优化】自定义组件长图组件 ( 自定义组件构造方法 )
  10. python模块引用