A Simple Math Problem HDU1757

一次ac

在做递推关系的题目的时候  快速幂矩阵真的很有用

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
struct matrix{
    int arr[10][10];
};

matrix multi( matrix a, matrix b )
{
         matrix c;
    for(int i=0;i<10;i++)
        for(int j=0;j<10;j++){
            c.arr[i][j]=0;
            for(int w=0;w<10;w++)
                c.arr[i][j]=(c.arr[i][j]+a.arr[i][w]*b.arr[w][j]%k)%k;
        }
    return c;
}

int fast(matrix a,int x){
    matrix ans;
    memset(ans.arr,0,sizeof(ans.arr));
    for(int i=0;i<10;i++)ans.arr[i][i]=1;

    while(x){
        if(x&1){
            ans=multi(ans,a);
               }
        x>>=1;
        a=multi(a,a);
    }
    int sum=0;
    for(int i=0;i<10;i++)
    {
        sum+=ans.arr[0][i]*( 9-i );
        sum%=k;
    }
  return sum;
}
int main(){

   while(scanf("%d%d",&n,&k)==2)
   {

       if(n<10){ printf("%d
",n%k); continue; }

     matrix  temp;
     memset(temp.arr,0,sizeof(temp.arr) );
     for(int i=1;i<10;i++)
        temp.arr[i][i-1]=1;
        for(int i=0;i<10;i++)scanf("%d",&temp.arr[0][i] );

     printf("%d
",fast( temp , n-9 )%k );
   }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/bxd123/p/10349164.html