悬赏征答问题降临

该代码实现了一系列的数学运算,包括高斯消元(gsc)、最大公约数(gcd)、最小公倍数(lcm)和扩展欧几里得算法(exgcd),并应用于数组中整数对的合并。在主函数中,对输入的整数对进行处理,最后输出合并后的结果。代码通过修改后解决了样例输出不一致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请问P4777哪里有问题?



#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll gsc(ll x, ll y, ll z)
{
	if(y == 0) return 0;
	ll ans = gsc(x, y / 2, z);
	ans = (ans + ans) % z;
	if(y % 2 == 1) ans = (ans + x) % z;
	return ans;
}

ll gcd(ll a, ll b)
{
	return b ? gcd(b, a % b) : a; 
}

ll a[100010];
ll b[100010];

ll lcm(ll a, ll b)
{
	return a / gcd(a, b) * b;
}

ll exgcd(ll a, ll b, ll & x, ll & y)
{
	if(b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}
	ll g, xp, yp;
	g = exgcd(b, a % b, xp, yp);
	x = yp;
	y = xp - yp * (a / b);
	return g;
}

void merge(ll & a1, ll & b1, ll a2, ll b2)
{
	ll l = lcm(a1, a2);
	ll g = gcd(a1, a2);
	ll k1p, k2p;
	g = exgcd(a1, a2, k1p, k2p);
	ll k = (b2 - b1) / g;
	ll k1 = gsc(k1p, k, l);
    ll x = gsc(k1, a1, l);
    x = ((x + b1) % l + l) % l;
	a1 = l;
	b1 = x;
}

int main()
{
	int n;
	cin >> n;
	for(int i = 1; i <= n; i ++) scanf("%lld%lld", &a[i], &b[i]);
	for(int i = 1; i <= n; i ++) b[i] %= a[i];
	for(int i = 2; i <= n; i ++) merge(a[i], b[i], a[i - 1], b[i - 1]);
	printf("%lld\n", b[n]);
	return 0;
}







我刚刚用了__int128就过了
但是这样写样例输出17

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值