【NOI2022省选挑战赛 Contest10 A】多项式求根(矩阵乘法)

多项式求根

题目链接:NOI2022省选挑战赛 Contest10 A

题目大意

给你 x+y,xy % 998244343 的值,要你求 x^n+y^n % 998244353 的值。

思路

考虑从 x n − 1 + y n − 1 x^{n-1}+y^{n-1} xn1+yn1 推出 x n + y n x^n+y^n xn+yn
( x n − 1 + y n − 1 ) ( x + y ) = x n + x n − 1 y + y n − 1 x + y n (x^{n-1}+y^{n-1})(x+y)=x^n+x^{n-1}y+y^{n-1}x+y^n (xn1+yn1)(x+y)=xn+xn1y+yn1x+yn
( x n − 1 + y n − 1 ) ( x + y ) = x n + y n + x y ( x n − 2 + y n − 2 ) (x^{n-1}+y^{n-1})(x+y)=x^n+y^n+xy(x^{n-2}+y^{n-2}) (xn1+yn1)(x+y)=xn+yn+xy(xn2+yn2)
x n + y n = ( x n − 1 + y n − 1 ) ( x + y ) − x y ( x n − 2 + y n − 2 ) x^n+y^n=(x^{n-1}+y^{n-1})(x+y)-xy(x^{n-2}+y^{n-2}) xn+yn=(xn1+yn1)(x+y)xy(xn2+yn2)
x i + y i = f i , ( x + y ) = a , x y = b x^i+y^i=f_i,(x+y)=a,xy=b xi+yi=fi,(x+y)=a,xy=b
f n = a f n − 1 − b f n − 2 f_n=af_{n-1}-bf_{n-2} fn=afn1bfn2

然后就可以用矩阵乘法来做啦!

代码

#include<cstdio>
#define ll long long
#define mo 998244353

using namespace std;

ll a, b, n;
struct matrix {
	ll n, m, a[3][3];
}A, B, C, one;

matrix operator *(matrix x, matrix y) {
	matrix re;
	re.n = x.n; re.m = y.m;
	for (int i = 1; i <= re.n; i++)
		for (int j = 1; j <= re.m; j++)
			re.a[i][j] = 0;
	for (int k = 1; k <= x.m; k++)
		for (int i = 1; i <= re.n; i++)
			for (int j = 1; j <= re.m; j++)
				(re.a[i][j] += x.a[i][k] * y.a[k][j] % mo) %= mo;
	return re;
}

matrix jcksm(matrix x, ll y) {
	matrix re = one;
	while (y) {
		if (y & 1) re = re * x;
		x = x * x; y >>= 1;
	}
	return re;
}

int main() {
	scanf("%lld %lld %lld", &a, &b, &n);
	
	A.n = 1; A.m = 2;
	A.a[1][1] = 2; A.a[1][2] = a;
	B.n = 2; B.m = 2;
	B.a[1][1] = 0; B.a[1][2] = mo - b;
	B.a[2][1] = 1; B.a[2][2] = a;
	one.n = 2; one.m = 2;
	one.a[1][1] = 1; one.a[1][2] = 0;
	one.a[2][1] = 0; one.a[2][2] = 1;
	C = jcksm(B, n - 1);
	
	A = A * C;
	printf("%lld", A.a[1][2]);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值