40pts求调
查看原帖
40pts求调
756660
B612Dusk楼主2023/11/8 21:24

用的也是 Ci+Pix≡Cj+Pjx(mod  M)(x>min(Li,Lj))C_i +P_ix \equiv C_j +P_jx(mod \ \ M) (x > min(L_i, L_j)) 的方程,但是挂了,手推样例没推动,求求

#include <cstdio>
#include <iostream>
#define int long long
using namespace std;
const int N = 20;
inline int read()
{
	int t;
	scanf("%lld", &t);
	return t;
}

int n, st;
int c[N], p[N], l[N];

int exgcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

signed main() 
{
	n = read();
	for(int i = 1;i <= n;i = -~i)
		c[i] = read(), p[i] = read(), l[i] = read(), st = max(st, c[i]);
		
	int m;
	for(m = st;m <= 1000000;m = -~m)
	{
		bool f = 0;
		for(int i = 1;i < n;i = -~i)
			for(int j = i + 1;j <= n;j = -~j) 
			{
				int a = ((p[i] - p[j]) % m + m) % m;
				int b = ((c[j] - c[i]) % m + m) % m;
				
				int x, y, d = exgcd(a, m, x, y);
				
				x = (x * b / d % m + m) % m;
				
				if(!b || b % d != 0 || x > min(l[i], l[j]))	 continue; // 余数为 0 、没有解、解不在区间内
				else
				{
					f = 1, i = n + 1, j = n + 1;
					break;
				}
			}
		if(!f)	break;
	}
	printf("%lld", m);
	return 0;
}
2023/11/8 21:24
加载中...