题意:第一行矩阵为23,233,2333...给出第一列的矩阵值,求an,m。
思路:很容易想到矩阵求解
大概就是这样中间一堆都是1.
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxn=20; const int mod=1e7+7; struct Marix{//矩阵 int mo[maxn][maxn],n; Marix(){} Marix(int _n){ n=_n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++) mo[i][j]=0; } } }; Marix mul(Marix a,Marix b){//矩阵乘法 Marix res=Marix(a.n); for(int i=0;i<a.n;i++){ for(int j=0;j<a.n;j++){ for(int k=0;k<a.n;k++){ int tmp=(long long )a.mo[i][k]*b.mo[k][j]%mod; res.mo[i][j]=(res.mo[i][j]+tmp)%mod; } } } return res; } Marix powMod(Marix a,int n){//矩阵快速幂 Marix nul; nul=Marix(a.n); for(int i=0;i<nul.n;i++){ nul.mo[i][i]=1; } while(n){ if(n&1) nul=mul(nul,a); a=mul(a,a); n>>=1; } return nul; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { Marix t1=Marix(n+2); t1.mo[0][0]=23; for(int i=1;i<=n;i++) { scanf("%d",&(t1.mo[0][i])); } t1.mo[0][n+1]=1; Marix t=Marix(n+2); for(int i=0;i<n+2;i++) { t.mo[i][i]=1; t.mo[n+1][i]=3; t.mo[0][i]=10; } for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { t.mo[j][i]=1; } } for(int i=0;i<n+2;i++) { t.mo[i][n+1]=0; } t.mo[n+1][n+1]=1; Marix ans1=powMod(t,m); Marix ans=mul(t1,ans1); printf("%d ",ans.mo[0][n]); } }