A Simple Math Problem HDU1757

时间:2022-01-06 22:45:29

一次ac

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

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
struct matrix{
int arr[][];
}; matrix multi( matrix a, matrix b )
{
matrix c;
for(int i=;i<;i++)
for(int j=;j<;j++){
c.arr[i][j]=;
for(int w=;w<;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,,sizeof(ans.arr));
for(int i=;i<;i++)ans.arr[i][i]=; while(x){
if(x&){
ans=multi(ans,a);
}
x>>=;
a=multi(a,a);
}
int sum=;
for(int i=;i<;i++)
{
sum+=ans.arr[][i]*( -i );
sum%=k;
}
return sum;
}
int main(){ while(scanf("%d%d",&n,&k)==)
{ if(n<){ printf("%d\n",n%k); continue; } matrix temp;
memset(temp.arr,,sizeof(temp.arr) );
for(int i=;i<;i++)
temp.arr[i][i-]=;
for(int i=;i<;i++)scanf("%d",&temp.arr[][i] ); printf("%d\n",fast( temp , n- )%k );
}
return ;
}