HDOJ 233 Matrix 5015

純套板子題
找出列與列之間的遞推關(guān)系;
|10 10 10 10 0 | | 2310 + 3 |
| 0 1 1 1 0 | | a1 + 23
10 + 3 |
| 23 a1 a2 a3 3 | | 0 0 1 1 0 | = | a1+a2+2310+3 |
| 0 0 0 1 0 | |a1+a2+a3+23
10+3 |
| 1 1 1 1 1 | | 3 |

嗯,就是這樣 n+2個(gè)數(shù)做m次矩陣乘法
然后就沒有然后了。。。。。。
上代碼

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<string.h>
#define LL long long 
using namespace std;
const int mod = 10000007;
struct mat
{
    int m[15][15];
}unit;


int n; 
 void print(mat tmp)
{
    printf("**************8\n");
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d  ",tmp.m[i][j]);
        }
        printf("\n");
    }
}
mat operator * (mat a, mat b)
{
    mat ret;
    LL x;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            x = 0;
            for(int k=0;k<n;k++)
            {
                x += ((LL)a.m[i][k] * b.m[k][j])%mod;
                ret.m[i][j] = x%mod;
            }
        }
    }
    return ret;
}
mat pow_mat(mat a, LL x)
{
    mat ret;
    memset(ret.m,0,sizeof(ret.m));
    for(int i=0;i<n;i++)  ret.m[i][i] = 1;
    while(x)
    {
        if(x & 1) ret = ret*a;
        a = a*a;
        x >>= 1;
    }
    return ret;
}
mat create()
{
    mat tmp;
    memset(tmp.m,0,sizeof(tmp.m));
    for(int i = 0;i < n-1;i++)  tmp.m[0][i] = 10;
    for(int i = 0;i < n;i++)  tmp.m[n-1][i] = 1;
    for(int i=1;i<n-1;i++)
    {
        for(int j = i;j<n-1;j++)
        {
            tmp.m[i][j] = 1;
        }
    }
    return tmp;
}

int main()
{
    int a;
    LL b;
    while(scanf("%d%lld",&a,&b) != EOF)
    {
        n = a+2;
        mat ans;
        memset(ans.m,0,sizeof(ans.m));
        ans.m[0][0] = 23;
        ans.m[0][a+1] = 3;
        for(int i=1;i<=a;i++)
        {
            scanf("%d",&ans.m[0][i]);
            ans.m[0][i] %= mod;
        }
        //print(ans);
        mat res = create();
        //print(res);
        res = pow_mat(res,b);
        //print(res);
        ans = ans * res;
        //print(ans);
        printf("%d\n",ans.m[0][a]);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容