Chieh's Blog

Because Of Coding

HDU 1757 A Simple Math Problem

Chieh posted @ 2015年8月24日 18:37 in NO Answer No Speak , 251 阅读
/*
Author:Chieh
Because Of Coding
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#define LL long long
#define INF 1e9
#define EPS 1e-9
using namespace std;
int k,m;
int F[10];
int d;
struct matrix
{
    LL e[10][10];
};
void init()
{
    d=9;
    for(int i=0; i<=9; i++)
    {
        scanf("%d",&F[i]);
    }
}
matrix mul(matrix p,matrix q)
{
    LL i,j,k;
    matrix c;
    for(i=0; i<=d; i++)
    {
        for(j=0; j<=d; j++)
        {
            c.e[i][j]=0;
            for(k=0; k<=d; k++)
                c.e[i][j]=(c.e[i][j]+p.e[i][k]*q.e[k][j])%m;
        }
    }
    return c;
}
matrix s;
matrix a;
void matrix_pow(LL b)
{
    while(b)
    {
        if(b&1)s=mul(s,a);
        a=mul(a,a);
        b=b>>1;
    }
    //a矩阵的b次 返回 s矩阵
}

void play()
{
    if(k<10)printf("%d\n",k);
    else
    {
        for(int i=0; i<=9; i++)
        {
            for(int j=0; j<=9; j++)
            {
                if(i==j) s.e[i][j]=1;
                else s.e[i][j]=0;
            }
        }
        // cout<<s.e[0][2]<<endl;

        for(int i=0; i<=9; i++)
        {
            for(int j=0; j<=9; j++)
            {
                if(j==0)
                {
                    a.e[i][j]=F[i];
                }
                else if(i+1==j)
                {
                    a.e[i][j]=1;
                }
                else
                {
                    a.e[i][j]=0;
                }
            }
        }
        /*   for(int i=0; i<=9; i++)
           {
               for(int j=0; j<=9; j++)
               {
                   cout<<a.e[i][j]<<" ";
               }
               cout<<endl;
           }
           cout<<"---------------------------"<<endl;*/
        matrix_pow(k-9);
        /*  for(int i=0; i<=9; i++)
          {
              for(int j=0; j<=9; j++)
              {
                  cout<<s.e[i][j]<<" ";
              }
              cout<<endl;
          }*/
        LL ans=0;
        int t=9;
        for(int i=0; i<=9; i++)
        {
            ans=(ans+(t*s.e[i][0])%m)%m;
            t--;
        }
        printf("%I64d\n",ans);
    }
}
int main()
{
    while(scanf("%d%d",&k,&m)!=EOF)
    {
        init();
        play();
    }
//    cout << "Hello world!" << endl;
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter