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]);
	}
}

 

全部评论

相关推荐

11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
今天 11:21
门头沟学院 Java
总包48.5w,意想不到的价格
无情咸鱼王的秋招日记之薛定谔的Offer:R
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务