还是我
容易(☚xzz说的)想出,x年后i号野人的位置为:\((C_i+P_i*x)\mod m\)
我们只要让任意方程:\((C_i+P_i*x)\mod m=(C_j+P_j*x)\mod m\) 解小于\(L_i\)或小于\(L_j\)即可
推式子!
\[(C_i+P_i*x)≡(C_j+P_j*x)\ (mod ~m)\\ ⇿x*(P_i-P_j)+y*m=C_j-C_i \]然后就是拓展欧几里得模板了。
(第一层枚举m,第二层枚举i,第三层枚举j)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int x,y,ans,n,c[20],p[20],l[20];
int ojld(int a,int b){
if(!b){
x=1;
ans=a;
return a;
}
ans=ojld(b,a%b);
int t=y;
y=x-a/b*t;
x=t;
return ans;
}
signed main(){
cin>>n;
int maxx=0;
for(int i=1;i<=n;i++){
cin>>c[i]>>p[i]>>l[i];
maxx=max(maxx,c[i]);
}
for(int k=maxx;;k++){
int flag=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int a=p[i]-p[j],b=k;
a=(a%k+k)%k;
x=0,y=0;
ojld(a,b);
if((c[j]-c[i])%ans){
continue;
}
x*=(c[j]-c[i])/ans;
int mod=k/ans;
x=(x%mod+mod)%mod;
if(x<=l[i]&&x<=l[j]){
flag=1;
break;
}
}
if(flag){
break;
}
}
if(flag){
continue;
}
cout<<k;
break;
}
return 0;
}
标签:Savage,maxx,P321,int,题解,枚举,ans,20,mod
From: https://www.cnblogs.com/lewisak/p/18146980