BZOJ 1407: [Noi2002]Savage 扩展欧几里得
2017-04-27 20:44
351 查看
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
//该样例对应于题目描述中的例子。
解法:
分析两个野人的情况,设山洞数目为m,如果i和j在第x年相遇,那么可以得到一个同余方程ci+x*pi=cj+x*pj(mod m),
即(pi-pj)*x=cj-ci(mod m)。所以要使两个野人不能相遇,只需该同余方程无解或者x比其中一个野人的寿命长。推广到
n个野人两两不相遇,只需任意两个野人满足上述条件,因为n很小,所以可以枚举。
我们一开始将m赋值为max{c[i]},每次判断m是否可行,如果可行即为答案,否则就将m加1。在判断m是否可行时要用
到扩展欧几里得算法求。
注意:扩展欧几里得算法求满足ax=gcd(a,b) (mod b)的x的最小正整数解时,要将x对b/gcd(a,b)取模,而不是对b取
模。
形如ax=b (mod c)可以转化为ax+cy=b (mod c),然后a,b,c同时mod gcd(a,c)再求。
//BZOJ 1407 #include <bits/stdc++.h> using namespace std; ///Ci+x*Pi同余(Cj+x*Pj)%m const int limitn = 20; int C[limitn], P[limitn], L[limitn]; int limit, n, a, b, c, x, y; inline int gcd(int a, int b){ if(!b) return a; else return gcd(b,a%b); } inline void exgcd(int a, int b, int &x, int &y){ if(!b){x=1;y=0;} else exgcd(b,a%b,y,x), y-=x*(a/b); } bool solve(int m) { for(int i=1; i<n; i++){ for(int j=i+1; j<=n; j++){ a = P[i]-P[j]; b = m; c = C[j]-C[i]; int t=gcd(a, b); if(c%t) continue; a/=t, b/=t, c/=t; exgcd(a, b, x, y); b=abs(b); x=((c*x)%b+b)%b; if(!x) x+=b; if(x>L[i]||x>L[j]) continue; else return false; } } return true; } 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]>limit) limit = C[i]; } for(int i=limit; ; i++){ if(solve(i)){ printf("%d\n", i); return 0; } } return 0; }
相关文章推荐
- bzoj 1407: [Noi2002]Savage【扩展欧几里得+中国剩余定理】
- bzoj [Noi2002]Savage 扩展欧几里得
- [BZOJ 1407][NOI 2002]Savage(中国剩余定理+扩展欧几里得)
- 【扩展欧几里得】Bzoj 1407: [Noi2002]Savage
- bzoj [Noi2002]Savage 扩展欧几里得
- BZOJ_P1407&Codevs_P1747 [NOI2002]Savage(数论+扩展欧几里得)
- BZOJ1407 [Noi2002]Savage 【扩展欧几里得】
- 数学/扩展欧几里得/NOI2002 荒岛野人 savage
- 【扩展欧几里得】Bzoj 1407: [Noi2002]Savage
- 拓展欧几里得 [Noi2002]Savage
- [BZOJ1407][NOI2002]Savage(扩展欧几里德)
- [NOI2002]Sevege 扩展欧几里得
- BZOJ 1407: [Noi2002]Savage( 数论 )
- [BZOJ1407][NOI2002]Savage(扩欧)
- 【BZOJ1407】 [Noi2002]Savage
- bzoj1407: [Noi2002]Savage
- [noi2002]荒岛野人 拓展欧几里得
- 【BZOJ】1407 NOI 2002 荒岛野人Savage
- [BZOJ1407][Noi2002]Savage
- 1407: [Noi2002]Savage 扩展欧几里得算法