您的位置:首页 > 其它

hdu 5015 233 Matrix

2015-10-07 20:07 176 查看
题目:题目中给出a(0,1),a(0,2)....a(0,m)和a(1,0),a(2,0)...a(n,0),a(n,m) = a(n-1,m) + a(n,m-1)

矩阵快速幂 初始的为{233,a(1,0),a(2,0)...a(n,0),3},然后a(i,j) = a(i,j-1)+a(i-1,j),a(i-1,j)可以就是上一个(a(i-1,j))算出来的结果,a(i,j-1)就是当前项,就可以递推了。。

代码:

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
using namespace std;
#define ll long long
const int N = 12;
const ll mod = 10000007;
struct Matrix{
ll a

;
Matrix(){
memset(a,0,sizeof(a));
for(int i = 0;i < N;i ++)
a[i][i] = 1;
}
};
Matrix multiply(Matrix a,Matrix b,int n){
Matrix ans;
memset(ans.a,0,sizeof(ans.a));
for(int i = 0;i < n;i ++){
for(int j = 0;j < n;j ++){
for(int k = 0;k < n;k ++){
ans.a[i][k] = (ans.a[i][k] + a.a[i][j]*b.a[j][k]%mod)%mod;
}
}
}
return ans;
}
Matrix fast_mod(Matrix A,ll k,int n){
Matrix ans;
while(k){
if(k&1)ans = multiply(ans,A,n);
A = multiply(A,A,n);
k = k>>1;
}
return ans;
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
ll now[12] = {0};
for(int i = 1;i <= n;i ++)
scanf("%I64d",&now[i]);
now[0] = 233;
now[n+1] = 3;
Matrix ans;
memset(ans.a,0,sizeof(ans.a));
ans.a[0][0] = 10,ans.a[0][n+1] = 1;
for(int i = 1;i <= n;i ++){
int siz = i+1;
for(int j = 0;j < siz;j ++){
ans.a[i][j] = 1;
}
}
ans.a[n+1][n+1] = 1;
ans = fast_mod(ans,m,n+2);
ll aa = 0;
for(int i = 0;i < n+2;i ++){
aa = (aa + ans.a
[i]*now[i]%mod)%mod;
}
cout<<aa<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: