1. 程式人生 > >HDU1575 矩陣快速冪入門

HDU1575 矩陣快速冪入門

Problem Description
A為一個方陣,則Tr A表示A的跡(就是主對角線上各項的和),現要求Tr(A^k)%9973。

Input
資料的第一行是一個T,表示有T組資料。
每組資料的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)兩個資料。接下來有n行,每行有n個數據,每個資料的範圍是[0,9],表示方陣A的內容。

Output
對應每組資料,輸出Tr(A^k)%9973。

Sample Input
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9

Sample Output
2
2686

其實就和快速冪一樣…道理不難
但是不太好寫…
特別是開始對jieguo這個變數賦值要分各種情況…
巨煩…
過幾天去掉一些東西把這個玩意裝進函式裡
會改成模板的….

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<memory.h>
#include<cstdlib>
using namespace std;
struct p
{
    int tu[11][11];
    void ini()
    {
        for
(int a=0;a<=10;a++) { for(int b=0;b<=10;b++) { tu[a][b]=0; } } } void iny() { for(int a=0;a<=10;a++) { for(int b=0;b<=10;b++) { tu[a][b]=1; } } } }; int
n,k; p xiangcheng(p a,p b) { p c; c.ini(); for(int q=1;q<=n;q++) { for(int w=1;w<=n;w++) { for(int e=1;e<=n;e++) { c.tu[q][w]+=a.tu[q][e]*b.tu[e][w]; c.tu[q][w]%=9973; } } } return c; } p q,jieguo,w; int main() { int T; cin>>T; memset(&q,0,sizeof(&q)); while(T--) { cin>>n>>k; q.ini(); w.ini(); jieguo.ini(); int qq=k; for(int a=1;a<=n;a++)for(int b=1;b<=n;b++)cin>>q.tu[a][b]; w=q; if(qq&1)qq>>=1,jieguo=w,w=xiangcheng(w,w); else { while((qq&1)==0) { w=xiangcheng(w,w); qq>>=1; } qq>>=1; jieguo=w; w=xiangcheng(w,w); } while(qq) { if(qq&1)jieguo=xiangcheng(jieguo,w); w=xiangcheng(w,w); qq>>=1; } int ans=0; for(int a=1;a<=n;a++) { ans+=jieguo.tu[a][a]; ans%=9973; } cout<<ans<<endl; } return 0; }