A Simple Math Problem hdu1757

来源:互联网 发布:授受不亲 知乎 编辑:程序博客网 时间:2024/05/12 15:45

/*  这是一个典型的二分矩阵的问题,我弄了好久才弄出来,而且参考了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;
}
   

原创粉丝点击