Tr A hdu 1575

來源:互聯網
上載者:User

/*<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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.