类欧几里得算法

模板

#include <iostream>
#include <cstdio>
using namespace std;
const int MOD = 998244353;
int inv2, inv6, n, a, b, c;
long long quickPower (long long x, long long y) {
	long long res = 1;
	while (y) {
		if (y & 1) res = res * x % MOD;
		x = x * x % MOD;
		y >>= 1;
	}
	return res;
}
struct Euclid {
	Euclid () {
		f = g = h = 0;
	}
	long long f, g, h;
};
Euclid calc (long long n, long long a, long long b, long long c) {
	long long ac = a / c, bc = b / c, m = (a * n + b) / c, n1 = n + 1, n21 = n * 2 + 1;
	Euclid d;
	if (!a) {
		d.f = bc * n1 % MOD;
		d.g = bc * n % MOD * n1 % MOD * inv2 % MOD;
		d.h = bc * bc % MOD * n1 % MOD;
		return d;
	}
	if (a >= c || b >= c) {
		Euclid e = calc(n, a % c, b % c, c);
		d.f = ((n * n1 % MOD * inv2 % MOD * ac % MOD + bc * n1 % MOD) % MOD + e.f) % MOD;
		d.g = ((ac * n % MOD * n1 % MOD * n21 % MOD * inv6 % MOD + bc * n % MOD * n1 % MOD * inv2 % MOD) % MOD + e.g) % MOD;
		d.h = ((ac * ac % MOD * n % MOD * n1 % MOD * n21 % MOD * inv6 % MOD + bc * bc % MOD * n1 % MOD + ac * bc % MOD * n % MOD * n1 % MOD) % MOD + e.h + 2 * bc % MOD * e.f % MOD + 2 * ac % MOD * e.g % MOD) % MOD;
		return d;
	}
	Euclid e = calc(m - 1, c, c - b - 1, a);
	d.f = ((n * m % MOD - e.f) % MOD + MOD) % MOD;
	d.g = ((m * n % MOD * n1 % MOD - e.h - e.f) % MOD + MOD) % MOD * inv2 % MOD;
	d.h = ((n * m % MOD * (m + 1) % MOD - 2 * e.g - 2 * e.f - d.f) % MOD + MOD) % MOD;
	return d;
}
inline void init () {
	scanf("%d%d%d%d", &n, &a, &b, &c);
	Euclid ans = calc(n, a, b, c);
	printf("%lld %lld %lld\n", ans.f, ans.h, ans.g);
}
int main () {
	inv2 = quickPower(2, MOD - 2);
	inv6 = quickPower(6, MOD - 2);
	int t;
	scanf("%d", &t);
	while (t --) init();
	return 0;
}
posted @   duoluoluo  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示