100pts,但是不解
查看原帖
100pts,但是不解
701221
Chr0n1CleC楼主2022/11/1 13:40

为什么矩阵倒一下就AC了? 最开始写的:

#include<stdio.h>

#define ll long long

inline ll read()
{
	register ll ret = 0, f = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		(ch == '-') ? f = -1 : 0, ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return ret * f;
}



ll mod;

struct mat
{
	ll a[9][9];
	inline mat()
	{
		for (register int i = 0;i < 5;++ i)
			for (register int j = 0;j < 5;++ j)
				a[i][j] = 0;
	}
	inline mat operator * (const mat& x)
	{
		mat ret;
		for (register int i = 1;i < 3;++ i)
			for (register int j = 1;j < 3;++ j)
				for (register int k = 1;k < 3;++ k)
					ret.a[i][j] = (ret.a[i][j] + a[i][k] * x.a[k][j] % mod) % mod;
		return ret;
	}
};

int main()
{
	register int p = read(), q = read(), a1 = read(), a2 = read(), n = read();
	mod = read();
	mat ans, a;
	ans.a[1][1] = a2, ans.a[2][1] = a1;
	a.a[1][1] = p, a.a[1][2] = q, a.a[2][1] = 1;
	if (n == 2)
		printf("%d", a2);
	else if (n == 1)
		printf("%d", a1);
	else
	{
		n -= 2;
		while (n)
		{
			if (n & 1)
				ans = ans * a;
			a = a * a;
			n >>= 1;
		}
		printf("%lld", ans.a[1][1]);
	}
		
	return 0;
}

后来改对的:

#include<stdio.h>

#define ll long long

inline ll read()
{
	register ll ret = 0, f = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		(ch == '-') ? f = -1 : 0, ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return ret * f;
}



ll mod;

struct mat
{
	ll a[9][9];
	inline mat()
	{
		for (register int i = 0;i < 5;++ i)
			for (register int j = 0;j < 5;++ j)
				a[i][j] = 0;
	}
	inline mat operator * (const mat& x)
	{
		mat ret;
		for (register int i = 1;i < 3;++ i)
			for (register int j = 1;j < 3;++ j)
				for (register int k = 1;k < 3;++ k)
					ret.a[i][j] = (ret.a[i][j] + a[i][k] * x.a[k][j] % mod) % mod;
		return ret;
	}
};

int main()
{
	register int p = read(), q = read(), a1 = read(), a2 = read(), n = read();
	mod = read();
	mat ans, a;
	ans.a[1][1] = a2, ans.a[1][2] = a1;
	a.a[1][1] = p, a.a[2][1] = q, a.a[1][2] = 1;
	if (n == 2)
		printf("%lld", a2);
	else if (n == 1)
		printf("%lld", a1);
	else
	{
		n -= 2;
		while (n)
		{
			if (n & 1)
				ans = ans * a;
			a = a * a;
			n >>= 1;
		}
		printf("%lld", ans.a[1][1]);
	}
		
	return 0;
}
2022/11/1 13:40
加载中...