您的位置:首页 > 其它

[BZOJ1407][Noi2002]Savage

2015-07-20 00:29 344 查看
原题地址

枚举每对野人后扩展欧几里得即可.

这样做理论复杂度貌似会爆结果没爆OLZ…

AC code:

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=101;
const int INF=1<<29;
int n,m0;
int c
,p
,l
;

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

int solve(int a,int b,int c){
int x,y,g;
if(a<0) a=(a/c+1)*c+a;
if(b<0) b=(b/c+1)*c+b;
exgcd(x,y,a,c);
g=a*x+c*y;
if(b%g) return INF;
x*=b/g;
c/=g;
if(x<0) x=((-x/c)+1)*c+x;
x%=c;
return x;
}

int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&c[i],&p[i],&l[i]);
if(c[i]>m0) m0=c[i];
}
for(int i=m0;i<=1000000;i++){
bool flag=1;
for(int j=1;j<=n-1&&flag;j++){
for(int k=j+1;k<=n&&flag;k++){
int x=solve(p[j]-p[k],c[k]-c[j],i);
if(x<=min(l[j],l[k])) flag=0;
}
}
if(flag){
printf("%d",i);
break;
}
}

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: