您的位置:首页 > 其它

bzoj2326 数学作业 矩阵乘法

2015-12-20 16:46 316 查看
这道题目的递推式为f(i)=f(i-1)*10^k+i,因为和i有关系,所以一开始我不知道怎么做。后来翻了题解才知道,原来可以在矩阵里把i也构造进去。构造矩阵乘法如下:

(f(i) , i , 1)=(f(i-1), i-1, 1)*((10^k , 0 , 0),(1 , 1 , 0),(1 , 1 , 1)),其中k为i的位数。然后矩阵乘法直接上就行了。注意当i=0时矩阵为(0 , 0 , 1)。

AC代码如下:

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;

struct mtx{ ll p[4][4]; }a,b,c; ll n,mod;
mtx tms                                                                                                                                                                                                                                                                                                                                                                                                                                                               (mtx x,mtx y){
mtx z; int i,j,k;
for (i=1; i<=3; i++)
for (j=1; j<=3; j++){
z.p[i][j]=0;
for (k=1; k<=3; k++) z.p[i][j]=(z.p[i][j]+x.p[i][k]*y.p[k][j]%mod)%mod;
}
return z;
}
int main(){
scanf("%lld%lld",&n,&mod); ll i,j,k;
a.p[1][3]=c.p[1][1]=c.p[2][1]=c.p[2][2]=c.p[3][1]=c.p[3][2]=c.p[3][3]=1;
for (i=1; i<=n; i=j+1){
j=i*10-1; if (j>n) j=n;
c.p[1][1]=c.p[1][1]*(ll)10%mod; b=c;
for (k=j-i+1; k; k>>=1){
if (k&1) a=tms(a,b); b=tms(b,b);
}
}
printf("%lld\n",a.p[1][1]%mod);
return 0;
}


by lych

2015.12.20
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: