WA后三个点 求助
查看原帖
WA后三个点 求助
747335
x383494楼主2023/2/19 20:48

RT,

#include <cstdio>
#include <stack>
#define UP(i, s, e) for(auto i=(s); i!=(e); ++i)
namespace m{
	using namespace std;
	typedef long long ll; typedef unsigned long long ull;
	ll exgcd(ll a, ll b, ll &x, ll &y){
		if (!b) {
			x = 1;
			y = 0;
			return a;
		}
		int d = exgcd(b, a % b, x, y);
		int t = x;
		x = y;
		y = t - (a / b) * y;
		return d;
	}
	ll mul(ll x, ll y, ll modn){
//		return (__int128)x*y%modn;  \
/*
        bool nag = false;
		if(x<0) x=-x, nag=!nag;
		if(y<0) y=-y, nag=!nag;
		ll ans = 0;
		while(y){
			if(y&1) ans = (ans+x) % modn;
			x = (x<<1)%modn;
			y>>=1;
		}
		return nag? -ans :ans;
//*/
	}
	constexpr int N = 1e5;
	stack<ll> ix, ip;
	int in;
	void solve(){
		scanf("%d", &in);
		UP(i, 0, in){
			ll x, p;
			scanf("%lld%lld", &p, &x);
			ix.push(x), ip.push(p);
		}
		for(;;){
			ll x1, x2, p1, p2;
			x1 = ix.top(), p1 = ip.top();
			ix.pop(); ip.pop();
			if(ix.empty()){
				printf("%lld", (x1+p1)%p1);
				break;
			}
			x2 = ix.top(), p2 = ip.top();
			ix.pop(); ip.pop();
			ll p, q;
			ll g = exgcd(p1, p2, p, q);
			ll m = p1/g*p2;
			p = mul(p, (x2-x1)/g, p2/g);
			ix.push((mul(p1, p, m)+x1+m)%m);
			ip.push(m);
		}
	}
}
int main(){m::solve(); return 0;}

2023/2/19 20:48
加载中...