hdu 6470 “字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛 1010 Count

T组,每组给出一个,求 

矩阵快速幂,由第N个状态到第N+1个状态,推出关系矩阵,然后关系矩阵快速幂,再乘以出事矩阵就好了。

由于的最高项为立方,所以需要加上平方项和一次方项和零次方项

Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 123456789;
ll len = 6;
struct node
{
	ll matrix[6][6];
	node()
	{
		memset(matrix, 0, sizeof matrix);
	}
	void set(ll a[6][6])
	{
		for (int i = 0; i < len; i++)
		{
			for (int j = 0; j < len; j++)
				matrix[i][j] = a[i][j];
		}
	}
	void one()
	{
		for (int i = 0; i < len; i++)
			matrix[i][i] = 1;
	}
	node operator * (node other)
	{
		node ans;
		for (int i = 0; i < len; i++)
		{
			for (int j = 0; j < len; j++)
			{
				for (int k = 0; k < len; k++)
				{
					ans.matrix[i][j] += matrix[i][k] * other.matrix[k][j] % mod;
					ans.matrix[i][j] %= mod;
				}
			}
		}
		return ans;
	}
};
node power(node a, ll b)
{
	node res;
	res.one();
	while (b)
	{
		if (b & 1)
			res = res * a;
		a = a * a;
		b >>= 1;
	}
	return res;
}
int main()
{
	//中间矩阵
	ll change[6][6] = {
		{0,1,0,0,0,0},
		{2,1,1,0,0,0},
		{0,0,1,3,3,1},
		{0,0,0,1,2,1},
		{0,0,0,0,1,1},
		{0,0,0,0,0,1},
	};
	//初始矩阵
	ll pre[6][6]={
		{1,0,0,0,0,0},
		{2,0,0,0,0,0},
		{27,0,0,0,0,0},
		{9,0,0,0,0,0},
		{3,0,0,0,0,0},
		{1,0,0,0,0,0},
	};
	node real;
	real.set(pre);
	node temp;
	temp.set(change);

	node q1 = power(temp, 1);
	node q2 = power(temp, 2);
	node q3 = power(temp, 3);

	int t;
	scanf("%d", &t);
	while (t--)
	{
		ll n;
		scanf("%lld", &n);
		node ans = power(temp, n - 1) * real;
		printf("%lld\n", ans.matrix[0][0]);
	}
}

 

全部评论

相关推荐

努力学习的小绵羊:我反倒觉得这种挺好的,给不到我想要的就别浪费大家时间了
点赞 评论 收藏
分享
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务