您的位置:首页 > 其它

hdu 1757 A Simple Math Problem(矩阵乘法)

2012-09-11 21:51 525 查看
题目分析:由题意可构造矩阵matrix[10][10],maze[1][1]=a0,maze[2][1]=a1,,,maze[10][1]=a9,,,,maze[1][2]=maze[2][3]=

,,,maze[9][10]=1,其余全为10.

则k>10时,maze[10][10]^(k-9), ans=9*maze[1][1],,,,+0*maze[10][1],,,,

代码:

#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
struct node
{
int matrix[11][11];
}maze;
int k,m;
node operator * (node x,node y)
{
node temp;
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
{
int t=0;
for(int k=1;k<=10;k++)
t+=(x.matrix[i][k]*y.matrix[k][j])%m;
temp.matrix[i][j]=(t%m);
}
return temp;
}
node fun(node b,int k)
{
node a;
if(k==0)
{
memset(a.matrix,0,sizeof(a.matrix));
for(int i=1;i<=10;i++)
a.matrix[i][i]=1;
return a;
}
if(k==1)
{
return b;
}
a=fun(b,k/2);
if(k%2==1)
{
return a*a*b;
}
else
return a*a;
}
int main()
{
while(scanf("%d %d",&k,&m)!=EOF)
{
int x;
memset(maze.matrix,0,sizeof(maze.matrix));
for(int i=1;i<=10;i++)
{
scanf("%d",&x);
maze.matrix[i][1]=x;
}
for(int i=1;i<=9;i++)
maze.matrix[i][i+1]=1;
int ans=0;
if(k<=9)
ans=k%m;
else
{
node a=fun(maze,k-9);
for(int i=1;i<=10;i++)
ans+=a.matrix[i][1]*(10-i);
ans%=m;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: