/*<br />其實跟自己以前寫的是貌似沒有區別的<br />*/<br />#include <iostream><br />#include <cstdio><br />#include <cstring><br />using namespace std;</p><p>int N;<br />const int mod = 9973;<br />struct Mat<br />{<br />int num[11][11];<br />Mat()<br />{<br />for(int i = 0; i < 11; i++)<br />for(int j = 0; j < 11; j++)<br />num[i][j] = 0;<br />}<br />};<br />Mat init, unit;</p><p>Mat mul(Mat a, Mat b)<br />{// 聽大牛說這樣可以最佳化,但是這樣一來感覺理解起來有點要繞彎,還是習慣自己傳統的寫法<br />Mat ans;<br />for(int i = 0; i < N; i++)<br />{<br />for(int k = 0; k < N; k++)<br />{<br />//ans.num[i][j] = 0;<br />if(a.num[i][k] == 0)<br />continue;<br />for(int j = 0; j < N; j++)<br />{<br />if(b.num[k][j] == 0)<br />continue;<br />ans.num[i][j] += a.num[i][k] * b.num[k][j];<br />if(ans.num[i][j] >= mod)<br />ans.num[i][j] %= mod;<br />}<br />//ans.num[i][j] %= mod;<br />}<br />}<br />return ans;<br />}</p><p>Mat mal(int n)<br />{<br />Mat p, q;<br />q = unit;<br />p = init;<br />while(n)<br />{<br />//if(n % 2 == 1)<br />if(n & 1)<br />{<br />p =mul(p, q);<br />n--;<br />}<br />else<br />{<br />q = mul(q, q);<br />//n /= 2;<br />n >>= 1;<br />}<br />}<br />return p;<br />//return mul(p, q);<br />}</p><p>int main()<br />{<br />int t;<br />scanf("%d", &t);<br />while(t--)<br />{<br />int n, k;<br />scanf("%d %d", &n, &k);<br />for(int i = 0; i < n; i++)<br />for(int j = 0; j < n; j++)<br />{<br />scanf("%d", &unit.num[i][j]);<br />init.num[i][j] = (i == j);<br />}<br />N = n;<br />Mat ans;<br />ans = mal(k);<br />int sum = 0;<br />for(int i = 0; i < n; i++)<br />sum += ans.num[i][i];<br />printf("%d/n", sum % mod);</p><p>}<br />}
http://acm.hdu.edu.cn/showproblem.php?pid=1575
#include<iostream>//典型的矩陣二分,只要記住模板,稍微修改就OK了
#include<cstdio>
#include<string>
using namespace std;
int MAX;
const int mod = 9973;
struct Mat
{
int df[11][11];
}init, unit;
Mat Mul(Mat a,Mat b)
{
int i, j, k;
Mat c;
for(i = 0; i < MAX; i++)
for(j = 0; j < MAX; j++)
{
c.df[i][j] = 0;
for(k = 0; k < MAX; k++)
c.df[i][j] += a.df[i][k] * b.df[k][j];
if(c.df[i][j] >= mod)
c.df[i][j] %= mod;
}
return c;
}
Mat cal(int t)
{
Mat p, q;
p = init;
q = unit;
while(t != 1)
{
if(t&1)
{
p = Mul(p, q);
t--;
}
else
{
q = Mul(q, q);
t >>= 1;
}
}
p = Mul(p, q);
return p;
}
int main()
{
int i, j, k, sum, t;
Mat tt;
scanf("%d", &t);
while(t--)
{
scanf("%d%d",&MAX, &k);
//memset(unit,0,sizeof(unit));
memset(unit.df,0,sizeof(unit.df));
memset(init.df,0,sizeof(init.df));
for(i = 0; i < MAX; i++)
for(j = 0; j < MAX; j++)
{
scanf("%d",&unit.df[i][j]);
init.df[i][i] = 1;
}
tt = cal(k);
sum = 0;
for(i = 0; i < MAX ; i++)
for(j = 0; j < MAX; j++)
if(i == j)
sum += tt.df[i][j] % mod;
printf("%d/n", sum % mod);
}
return 0;
}