HDU1757(矩阵快速幂)


#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

int a[10];
int kk,m;
__int64 matrix[10][10];
__int64 ans[10][10];

void matrixmul1()
{
	int i,j,k;
	__int64 temp[10][10];
	for (i=0;i<10;i++)
		for (j=0;j<10;j++)
		{
			temp[i][j]=0;
			for (k=0;k<10;k++)
				temp[i][j]+=(ans[i][k]%m)*(matrix[k][j]%m)%m;
		}
	memcpy(ans,temp,sizeof(ans));
}

void matrixmul2()
{
	int i,j,k;
	__int64 temp[10][10];
	for (i=0;i<10;i++)
		for (j=0;j<10;j++)
		{
			temp[i][j]=0;
			for (k=0;k<10;k++)
				temp[i][j]+=(matrix[i][k]%m)*(matrix[k][j]%m)%m;
		}
	memcpy(matrix,temp,sizeof(matrix));
}

void mul(int k)
{
	int i;
	memset(ans,0,sizeof(ans));
	for (i=0;i<10;i++)
		ans[i][i]=1;
	while (k)
	{
		if (k&1)
			matrixmul1();
		k>>=1;
		matrixmul2();
	}
}

int main()
{
	int i;
  while (scanf("%d",&kk)!=EOF)
  {
  	scanf("%d",&m);
  	memset(matrix,0,sizeof(matrix));
  	for (i=0;i<10;i++)
  		scanf("%I64d",&matrix[0][i]);
  	for (i=1;i<10;i++)
  		matrix[i][i-1]=1;
  	mul(kk-9);
  	__int64 anss=0;
  	for (i=0;i<10;i++)
  		anss+=(ans[0][i]%m)*(9-i)%m;
  	anss%=m;
  	printf("%I64d\n",anss);
  }
}


你可能感兴趣的:(HDU1757(矩阵快速幂))