hdu1757 - A Simple Math Problem 矩阵快速幂

引用两篇大佬的文章:

https://blog.csdn.net/zjtzyrc/article/details/45287233

https://blog.csdn.net/hnust_xiehonghao/article/details/8175467

他们两篇文章对这个题讲解已经很透彻了,我目前还不明白如何构造矩阵。。。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long int num,mod;
long long int danwei[11];
struct node
{
	long long int map[10][10];
}ans,base;
node mulit(node a,node b)
{
	node c;
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			c.map[i][j]=0;
			for(int k=0;k<10;++k)
			{
				c.map[i][j]+=(b.map[i][k]*a.map[k][j])%mod;
			}
		}
	}
	return c;
}
long long int poww(long long int k)//¾ØÕó¿ìËÙÃÝ
{
	int i;
	memset(ans.map,0,sizeof(ans.map));
	memset(base.map,0,sizeof(base.map));
	for(int i=0;i<10;i++)
	{
		base.map[0][i]=danwei[i];
		if(i!=9)
		base.map[i+1][i]=1;
	}
	for(i=0;i<10;i++)
	{
		ans.map[i][0]=9-i;
	}
	while(k!=0)//¾ØÕó¿ìËÙÃݵĺËÐIJ¿·Ö
	{
		if(k&1!=0)
		{
			ans=mulit(ans,base);
			}	
		base=mulit(base,base);
		k>>=1;
	}
	return ans.map[0][0];
}
int main()
{

	while(scanf("%lld%lld",&num,&mod)!=EOF)
	{
		int i;
		for(i=0;i<10;i++)
		{
			scanf("%lld",&danwei[i]);
		}
		if(num<10) cout<<num<<endl;
		else
		cout<<poww(num-9)%mod<<endl;// ´Ó10¿ªÊ¼£¬Òò´Ë¼õ9
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zvenWang/article/details/82106880
今日推荐