hpuvj【1575】Tr A(快速冪求模模板題)
阿新 • • 發佈:2019-02-15
Tr A
每組資料的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)兩個資料。接下來有n行,每行有n個數據,每個資料的範圍是[0,9],表示方陣A的內容。
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
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
Sample Output
2 2686Source
HDU 2007-1 Programming Contest也是模板題 不過這個模板又和之前的有點不一樣 用了重鑄還是啥來著 完了名字了 不過就那個operator*這裡不一樣 前面的是沒有這個的,把乘法運算子的意義給變了一下,不過其實本質上是一樣的,程式碼如下:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int mod=9973; int n,k; struct Mat{ int a[14][14]; Mat() { memset(a,0,sizeof(a)); for(int i=1;i<=10;i++) { a[i][i]=1; } } }base; Mat operator*(Mat s,Mat b) { Mat r; memset(r.a,0,sizeof(r.a)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int p=1;p<=n;p++) { r.a[i][j]=r.a[i][j]+s.a[i][p]*b.a[p][j]; if(r.a[i][j]>mod) r.a[i][j]=r.a[i][j]%mod; } } } return r; } void power(Mat &ans) { while(k) { if(k%2==1) ans=base*ans; base=base*base; k=k/2; } } int main() { int T; scanf("%d",&T); while(T--) { Mat ans; scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d",&base.a[i][j]); power(ans); int sum=0; for(int i=1; i<=n; i++) { sum+=ans.a[i][i]; if(sum>=mod) sum%=mod; } printf("%d\n",sum); } }