您的位置:首页 > 其它

HDU 1757 A Simple Math Problem(矩阵快速幂)

2014-04-19 01:05 441 查看
题目链接

题意 :给你m和k, 让你求f(k)%m。如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + …… + a9 * f(k-10);
思路 :先具体介绍一下矩阵快速幂吧,刚好刚刚整理了网上的资料。可以先了解一下这个是干嘛的,怎么用。

这个怎么弄出来的我就不说了,直接看链接吧,这实在不是我强项,点这儿这儿也行

//HDU 1757
#include <iostream>
#include <stdio.h>

using namespace std;

struct matrix
{
int m[10][10] ;
} b,tp,res,init ;

int n,m ;

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

matrix matrix_mi(matrix p,int k)
{
matrix t = res;
for(int i = 0 ; i <= 10 ; i++) t.m[i][i] = 1 ;
while(k)
{
if(k & 1)
t = Mul(t,p) ;
k >>= 1 ;
p = Mul(p,p) ;
}
return t ;
}

void Init()
{
for(int i = 0 ; i < 10 ; i++)
for(int j = 0 ; j < 10 ; j++)
if(i-1 == j)
init.m[i][j]=1;
else
init.m[i][j]=0;
}
int main()
{
Init() ;
while(~scanf("%d %d",&n,&m))
{
b = init ;
for(int i = 0 ; i < 10 ; i++)
scanf("%d",&b.m[0][i]) ;
for(int i = 0 ; i < 10 ; i++)
for(int j = 0 ; j < 10 ; j++)
if(i==j)
res.m[i][j] = 1 ;
else
res.m[i][j] = 0 ;
if(n >= 10)
{
int sum = 0 ;
tp = matrix_mi(b,n-9) ;
for(int i = 0 ; i < 10 ; i++)
sum += (tp.m[0][i] * (9-i))%m ;
printf("%d\n",sum%m) ;
}
else printf("%d\n",n%m) ;
}
return 0;
}


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