hdoj1757 A Simple Math Problem(矩阵快速幂)

时间:2023-03-09 16:16:39
hdoj1757  A Simple Math Problem(矩阵快速幂)

构造矩阵。

1,当k<=9时,直接输出;

2,当k >9时,先求原矩阵的(k-9)次幂res矩阵,在求幂的过程中对m取余。最后res矩阵再与矩阵F相乘得到矩阵ans,相乘的过程中对m取余。ans矩阵的第一个元素就是答案。

PS.orz,这道题一气呵成。只不过我好像和大家构造矩阵的方向有点点差别。这不重要!能做出题就妥!

 #include<iostream>
#include<cstring>
#define maxn 12
using namespace std;
int f[]={,,,,,,,,,};
struct mat{
int a[maxn][maxn];
};
mat mat_mul(mat x,mat y,int Mod){
mat ans;
memset(ans.a,,sizeof(ans.a));
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++){
ans.a[i][j]+=x.a[i][k]*y.a[k][j];
ans.a[i][j]%=Mod;
}
return ans;
}
void mat_pow(mat &res,int k,int Mod){
mat c=res;
k--;
while (k){
if (k&) res=mat_mul(res,c,Mod);
k>>=;
c=mat_mul(c,c,Mod);
}
}
int main(){
mat res;
int k,m;
while (cin >> k >> m){
memset(res.a,,sizeof(res.a));
for (int i=;i<;i++){
cin >> res.a[i][];
res.a[i][i+]=;
}
if (k<=){
cout << f[k]%m << endl;
continue;
}
else mat_pow(res,k-,m);
int ans=;
for (int i=;i<;i++){
ans+=res.a[i][]*f[-i]%m;
}
cout << ans%m << endl;
}
return ;
}