bzoj 3240: [Noi2013]矩阵游戏
2018-01-03 08:18
387 查看
题意:
F[1][1]=1F[i,j]=a*F[i][j-1]+b (j!=1)
F[i,1]=c*F[i-1][m]+d (i!=1)
求F
[m]。
题解:
假如n,m小一点的话就是一个矩乘的裸题了。膜一发题解,发现居然可以用费马小定理优化?
其实是可以的(仅这题)
第一阶段,我们乘的是这个矩阵:
(ab01)
设这个矩阵是A,An就是:
(anb(an−1+an−2+…1)01)
=⎛⎝anb(an−1a−1)01⎞⎠
an是可以用费马小定理优化的,所以这个矩阵快速幂也可以(注意要特判a=1的情况)
然后第二阶段一样。
code:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #define LL long long using namespace std; LL mod=1000000007,a,b,c,d,p,n=0,m=0; char s1[1000010],s2[1000010]; struct node{ LL a[2][2],n,m; node() {memset(a,0,sizeof(a));} }; node operator * (node a,node b) { node ans;ans.n=a.n;ans.m=b.m; for(LL i=0;i<a.n;i++) for(LL j=0;j<b.m;j++) for(LL k=0;k<a.m;k++) ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mod; return ans; } node operator ^ (node a,LL b) { node ans;ans.n=a.n;ans.m=a.m; for(LL i=0;i<a.n;i++) ans.a[i][i]=1; while(b) { if(b&1) ans=ans*a; a=a*a;b>>=1; } return ans; } void F(char*s,LL &a) {for(LL i=1;s[i];i++) a=(a*10%p+s[i]-'0')%p;} int main() { scanf("%s %s %lld %lld %lld %lld",s1+1,s2+1,&a,&b,&c,&d); node A;p=(a==1)?mod:mod-1;F(s2,m); A.n=A.m=2;A.a[0][0]=a;A.a[1][0]=b;A.a[1][1]=1; m-=1;(m+=p)%=p;A=A^m; node B;p=(A.a[0][0]==1&&c==1)?mod:mod-1;F(s1,n); B.n=B.m=2;B.a[0][0]=c;B.a[1][0]=d;B.a[1][1]=1;B=A*B; n-=1;(n+=p)%=p;B=B^n;B=B*A; printf("%lld",(B.a[0][0]+B.a[1][0])%mod); }
相关文章推荐
- 【BZOJ3240】【UOJ124】【NOI2013】矩阵游戏
- BZOJ 3240 [Noi2013] 矩阵游戏 题解
- 【费马小定理+快速幂+逆元】BZOJ3240-[NOI2013]矩阵游戏
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
- bzoj3240: [Noi2013]矩阵游戏
- (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏
- BZOJ 3240: [Noi2013]矩阵游戏 矩阵乘法 费马小定理
- bzoj 3240: [Noi2013]矩阵游戏
- BZOJ 3240: [Noi2013]矩阵游戏
- 【BZOJ】【3240】【NOI2013】矩阵游戏
- [BZOJ3240][NOI2013]矩阵游戏
- bzoj 3240: [Noi2013]矩阵游戏
- bzoj3240: [Noi2013]矩阵游戏(矩阵乘法+快速幂)
- BZOJ3240 [Noi2013]矩阵游戏
- [BZOJ3240][Noi2013]矩阵游戏 && 快速幂
- BZOJ 3240 [NOI2013 D2T1] 矩阵游戏
- BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)
- [BZOJ 3240][Noi2013]矩阵游戏:逆元+递推
- [BZOJ3240][NOI2013]矩阵游戏(数论+矩乘)
- bzoj 3240 [Noi2013]矩阵游戏