您的位置:首页 > 其它

HDOJ 1757 A Simple Math Problem

2013-05-19 14:44 435 查看
矩阵快速幂的水题

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<iomanip>
using namespace std;
struct
aa
{

int
a[11][11];
};

int
mod;
aa f(aa m,aa n)
{

aa ans;
for
(int i=0;i<10;i++)
for
(int j=0;j<10;j++)
{

ans.a[i][j]=0;
for
(int k=0;k<10;k++)
ans.a[i][j]+=m.a[i][k]*n.a[k][j];
ans.a[i][j]%=mod;
}

return
ans;
}

aa mul(aa m,long k)
{

aa ans;
for
(int i=0;i<10;i++)
for
(int j=0;j<10;j++)
ans.a[i][j]=(i==j);
while
(k)
{

if
(k&1)
{

ans=f(ans,m);
}

k>>=1;
m=f(m,m);
}

return
ans;
}

int
main()
{

long
n,sum;
int
i,j;
while
(scanf("%d%d",&n,&mod)!=EOF)
{

aa p,ans;
memset(p.a,0,sizeof(p.a));
for
(i=0;i<10;i++)
{

scanf("%d",&p.a[0][i]);
}

for
(i=1;i<10;i++)
p.a[i][i-1]=1;
sum=0;
if
(n<10)
sum=n;
else

{

ans=mul(p,n-9);
for
(i=0;i<10;i++)
sum+=ans.a[0][i]*(9-i);
}

printf("%d\n",sum%mod);
}

return
0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: