bzoj1407: [Noi2002]Savage
也是复习题了 傻逼衣叉还我一等
两个野人无法相遇当
Ci+Pi*x=Cj+Pj*x (mod m)
(Pi-pj)*x=Cj-Ci (mod m)
无解 或 最小正整数解>min(Li,Lj)
转换一下
(Pi-pj)*x+m*y=Cj-Ci
要约一个最大公因数(不约居然会T囧)
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int exgcd(int a,int b,int &x,int &y) { if(a==0) { x=0;y=1; return b; } else { int tx,ty; int d=exgcd(b%a,a,tx,ty); x=ty-(b/a)*tx; y=tx; return d; } } int gcd(int a,int b) { if(a==0)return b; else return gcd(b%a,a); } int c[20],p[20],l[20]; int main() { int n,m=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&c[i],&p[i],&l[i]); m=max(m,c[i]); } while(1) { bool bk=true; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { int A=p[i]-p[j],B=m,K=c[j]-c[i]; int t=gcd(A,B); if(K%t==0) { int x,y; A/=t,B/=t,K/=t; int d=exgcd(A,B,x,y); B=abs(B); x=((x*K/d)%(B/d)+(B/d))%(B/d); if(x<=min(l[i],l[j])){bk=false;break;} } } if(bk==false)break; } if(bk==true){printf("%d\n",m);break;} m++; } return 0; }
pain and happy in the cruel world.