hdu 5015(マトリクスの高速べき乗)

3840 ワード

テーマリンク:http://acm.hdu.edu.cn/showproblem.php?pid=5015
233 Matrix
Time Limit:10000/5000 MS(Java/Others)    メモリLimit:65536/65536 K(Java/Others)Total Submission(s):823    Acceepted Submission(s):493
Problem Description
In our daily life we offten use 233 to express our feelings.Actualy,we may say 2333,or 23333...in the same meaning.And here is the question:Suppose we have a matrix caled 233.Inthers filt 233
0,1=233,a
0,2=2333,a
0,3=23333…)Besides、in 233 matix、we got a
i,j=a
i-1,j+a
i,j-1(i,j≠0).Now you have known a
1,0,a
2,0,…,a
n,0,could you tell me a
n,m in the 233 matrix?
 
Input
The re are multiple test cases.Please process till EOF.
For each case,the first line contains two postive integers n,m(n≦10,m≦10
9)The second line contains n integers、a
1,0,a
2,0,…,a
n,0(0≦a
i,0<2
31)
 
Output
For each case,output a
n,m mod 100000.
 
Sample Input
 
   
1 1 1 2 2 0 0 3 7 23 47 16
 

Sample Output
 
   
234 2799 72937
Hint
 

Source
2014 ACM/ICPC Asia Regional Xi'an Online
 

Recommend
hujie   |   We have carefully selected several similar problems for you:   5041  5040  5039  5038  5037 
思路:矩阵快速幂,由第一列推出剩下的列~有点得注意,要用I64d,如果用int 会wrong~~~可以从题目给的时间5000ms和题目给的数据看很出来~
#include 
#include 
#include 
#include 
#include 
#include 
const int mod=10000007;
typedef long long ll;
using namespace std;
int a[12];

struct matrix
{
 ll f[12][12];
};
//     ;
matrix mul(matrix a,matrix b)
{
  matrix c;
  memset(c.f,0,sizeof(c.f));
  for(int i=0;i<12;i++)
   for(int j=0;j<12;j++)
    for(int k=0;k<12;k++)
    {
     c.f[i][j]+=a.f[i][k]*b.f[k][j]%mod;  //             ,    mod           
     c.f[i][j]%=mod;
    }
  return c;
}
matrix pow_mod(matrix a,int b)
{
  matrix s;
  memset(s.f,0,sizeof(s.f));
  for(int i=0;i<12;i++)
    s.f[i][i]=1;
  while(b)
  {
    if(b&1)
    {
     s=mul(s,a);
    }
    b=b/2;
    a=mul(a,a);
  }
  return s;
}
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
      matrix e;
      memset(e.f,0,sizeof(e.f));
      for(int i=1;i<11;i++)
        for(int j=0;j<=i;j++)
          e.f[i][j]=1;
      e.f[0][0]=10; e.f[0][11]=1,e.f[11][11]=1;

      memset(a,0,sizeof(a));
      for(int i=1;i<=n;i++)cin>>a[i];
      a[0]=233,a[11]=3;
      e=pow_mod(e,m);
      ll sum=0;
      for(int i=0;i<12;i++)
      {
       sum=(sum+(e.f[n][i]*a[i]))%mod;
      }
      printf("%I64d
",sum%mod); } return 0; }