BZOJ-1407: [Noi2002]Savage (扩展欧几里得)

Posted 可惜没如果=_=

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ-1407: [Noi2002]Savage (扩展欧几里得)相关的知识,希望对你有一定的参考价值。

1407: [Noi2002]Savage

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 2276  Solved: 1019
[Submit][Status][Discuss]

Description

技术分享

Input

第1行为一个整数N(1<=N<=15),即野人的数目。
第2行到第N+1每行为三个整数Ci, Pi, Li表示每个野人所住的初始洞穴编号,每年走过的洞穴数及寿命值。
(1<=Ci,Pi<=100, 0<=Li<=10^6 )

Output

仅包含一个数M,即最少可能的山洞数。输入数据保证有解,且M不大于10^6。

Sample Input

3
1 3 4
2 7 3
3 2 1

Sample Output

6
//该样例对应于题目描述中的例子。

HINT

 

Source

鸣谢刘汝佳先生授权使用

 这题挺水的qwq

一开始是想着枚举任意两个人然后把可能的天数全部去掉,最后枚举m

然鹅孬孬说不能这么写??? 不知什么情况qwq  于是就先枚举m,在判断m可不可行

C1+P1*x=C2+P2*x+M*y      =>    (P1-P2)*x+(-M)*y=C2-C1 

可惜laj忘了模线性方程怎么解了 _(:зゝ∠)_

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int MAX=25;
 4 int n,m,C[MAX],P[MAX],L[MAX];
 5 int exgcd(int a,int b,int &x,int &y){
 6     if (b==0) return x=1,y=0,a;
 7     int d=exgcd(b,a%b,x,y);
 8     int t=x; x=y,y=t-a/b*y;
 9     return d;
10 }
11 int main(){
12     freopen ("gcd.in","r",stdin);freopen ("gcd.out","w",stdout);
13     int i,j,a,b,c,d,e,f,x,y;
14     scanf("%d",&n);
15     for (i=1;i<=n;i++) scanf("%d%d%d",C+i,P+i,L+i),m=max(m,C[i]);
16     for (;m<=1e6;m++){
17         bool flag=true;
18         for (i=1;i<=n;i++){
19             for (j=i+1;j<=n;j++){
20                 a=P[i]-P[j],b=m,c=C[j]-C[i];
21                 d=exgcd(a,b,x,y);
22                 if ((c%d)!=0) continue;
23                 x=x*c/d,x=x%(m/d);
24                 if (x<0) x+=abs(m/d);
25                 if (x<=L[i] && x<=L[j]) {flag=false;goto away;}
26             }
27         }
28         away:if (flag) return printf("%d",m),0;
29     }
30 }

 








以上是关于BZOJ-1407: [Noi2002]Savage (扩展欧几里得)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1407 [Noi2002]Savage

bzoj1407: [Noi2002]Savage

bzoj1407 [Noi2002]Savage——扩展欧几里得

BZOJ 1407[Noi2002]Savage ExGCD

BZOJ1407 NOI 2002 荒岛野人Savage

bzoj 1407: [Noi2002]Savage扩展欧几里得+中国剩余定理