A Simple Math Problem hdu1757

來源:互聯網
上載者:User

/*  這是一個典型的二分矩陣的問題,我弄了好久才弄出來,而且參考了2個人的代碼;
 我不知為何,我一開始構造的矩陣總是得不出正確的答案。
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9      
  1
      1
          1
               1 
                    1
                          1
                              1
                                    1
                                        1
                                            0  
         
9
8
7
6
5
4
3
2
1
0
  這兩個矩陣的乘積,在加一個單位矩陣,就通過了。
9 8 7 6 5 4 3 2 1 0

a0 1 1 1 1 1 1 1 1 1 1
a1
a2
a3
a4
a5
a6
a7
a8
a9

昨天想的是10 * 10   10*10
今天覺得好像1*10    10*10
的就可以了試下看,這道這個哪裡出錯了!!改成下面的就OK了,同時利用單位矩陣

a0 1 
a1  1  
a2    1
a3      1
a4        1
a5          1
a6            1
a7              1
a8                1
a9
感謝zhc給了靈感 也同時感謝網上給我錯誤修正的網址,同時感謝師傅,給我找出了最初的錯誤
*/ 
          
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int MAX=10;
int mod;

struct Mat
{
  int df[MAX][MAX];
}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;
 Mat tt;
 while(scanf("%d%d", &k, &mod) != EOF)
 {
  //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++)
  {
   scanf("%d",&unit.df[0][i]);
   init.df[i][i] = 1;
   if(i < MAX - 1)
   unit.df[i+1][i] = 1;
   
  }
   k -= 9;
  tt = cal(k);
  sum = 0;
  for(i = 0; i < MAX ; i++)
   sum += tt.df[0][i]*(9 - i) % mod;
  printf("%d/n", sum % mod);
 }
 return 0;
}

/*
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int MAX=10;
int mod;

struct Mat
{
 long long int df[MAX][MAX];
}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;
 Mat tt;
 while(scanf("%d%d", &k, &mod) != EOF)
 {
  //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++)
  {
   scanf("%d",&unit.df[i][0]);
   init.df[i][i] = 1;
   //if(i != 0)
   //unit.df[0][i] = 1;(這裡想錯了,矩陣構造好的話,要去試下的)
   if(i < 9)
   unit.df[i][i+1] = 1;
   
  }
   k -= 9;
  tt = cal(k);
  sum = 0;
  for(i = 0; i < MAX ; i++)
   sum += tt.df[i][0]*(9 - i) % 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.