bzoj1407 [Noi2002]Savage

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
//该样例对应于题目描述中的例子。

正解:$exgcd$。

直接对于所有答案暴力枚举,用$exgcd$判断合法性就行了。

 1 #include <bits/stdc++.h>
 2 #define il inline
 3 #define RG register
 4
 5 using namespace std;
 6
 7 int c[20],p[20],l[20],n,M;
 8
 9 il int gi(){
10   RG int x=0,q=1; RG char ch=getchar();
11   while ((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar();
12   if (ch==‘-‘) q=-1,ch=getchar();
13   while (ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-48,ch=getchar();
14   return q*x;
15 }
16
17 il int exgcd(RG int a,RG int b,RG int &x,RG int &y){
18   if (!b){ x=1,y=0; return a; }
19   RG int r=exgcd(b,a%b,y,x); y-=a/b*x; return r;
20 }
21
22 il int check(RG int i,RG int j,RG int M){
23   RG int a=(p[i]-p[j])%M,b=(c[j]-c[i])%M;
24   if (a<0) a+=M; if (b<0) b+=M;
25   RG int x,y,G=exgcd(a,M,x,y);
26   if (b%G) return 0; M/=G;
27   while (x<0) x+=M;
28   x=1LL*x*(b/G)%M; if (x<=0) x+=M;
29   return x<=min(l[i],l[j]);
30 }
31
32 int main(){
33 #ifndef ONLINE_JUDGE
34   freopen("savage.in","r",stdin);
35   freopen("savage.out","w",stdout);
36 #endif
37   n=gi();
38   for (RG int i=1;i<=n;++i)
39     c[i]=gi(),p[i]=gi(),l[i]=gi(),M=max(M,c[i]);
40   for (;;++M){
41     RG int fg=1;
42     for (RG int i=1;i<n;++i){
43       for (RG int j=i+1;j<=n;++j)
44     if (check(i,j,M)){ fg=0; break; }
45       if (!fg) break;
46     }
47     if (fg) break;
48   }
49   cout<<M; return 0;
50 }
时间: 2024-10-06 19:59:43

bzoj1407 [Noi2002]Savage的相关文章

[BZOJ1407][NOI2002]Savage(扩展欧几里德)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个m可以作为一个解当且仅当: 对于任意的i,j 模方程:c[i]+x*p[i]=c[j]+x*p[j] (mod m) 无解或者最小正整数解>min(l[i],l[j]) 这个可以用扩展欧几里德解决. 因为n<=15,所以可以暴力枚举每对i,j

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

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1407 看到一定有解,而且小于10^6,所以可以枚举: 判断一个解是否可行,就两两判断野人 i , j 能否满足在寿命内不相遇: 也就是 T*pi + ci ≡ T*pj + cj (mod m) 变成  ( pi - pj )*T + km = cj - ci 用扩展欧几里得解这个方程,得到T若大于两人中较小的寿命或无解则可行. 代码如下: #include<iostream> #inc

【数学 exgcd】bzoj1407: [Noi2002]Savage

exgcd解不定方程时候$abs()$不能乱加 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 Samp

BZOJ 1407: [Noi2002]Savage( 数论 )

枚举答案, 然后O(N^2)枚举野人去判他们是否会在有生之年存在同山洞. 具体做法就是: 设第x年相遇, 则 Ci+x*Pi=Cj+x*Pj (mod M), 然后解同余方程. 复杂度应该是O(ans*N^2log(ans)), 但是实际远小于....能够AC -------------------------------------------------------------------- #include<cstdio> #include<algorithm> #inclu

【BZOJ 1407】[Noi2002]Savage ExGCD

我bitset+二分未遂后就来用ExGCD了,然而这道题的时间复杂度还真是玄学...... 我们枚举m然后对每一对用ExGCD判解,我们只要满足在最小的一方死亡之前无解就可以了,对于怎么用,就是ax+by=c,在这里c是距离差,a是速度差,b是m,x是我们要的解,y随意. 时间复杂度O(m*n*n*log),然而这是标解.......... #include <cstdio> int prob[120][3],len,n,c[16],p[16],l[16],S; inline int Min(

bzoj 1407 [Noi2002]Savage

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1407 因为答案有很小的限制,所以可以枚举.(听说不能二分?) T*p[ i ] + c[ i ] = T*p[ j ] + c[ j ](mod m) <==>T*(p[ i ] - p[ j ]) + k * m = c[ j ] - c[ i ] 然后需要打一个正确的板子. 放一点笔记: exgcd有解,仅当得数是gcd的倍数.这样可以求出特解后同乘一个数得到解.ax+by=c的通解

bzoj 1000+AC

1500 [NOI2005]维修数列   5333 16036 1010 [HNOI2008]玩具装箱toy   5205 12140 2049 [Sdoi2008]Cave 洞穴勘测   4992 10282 1008 [HNOI2008]越狱   4820 11120 1503 [NOI2004]郁闷的出纳员   4629 12915 1208 [HNOI2004]宠物收养所   4216 10462 1026 [SCOI2009]windy数   4169 9168 1003 [ZJOI2

【BZOJ】1407 NOI 2002 荒岛野人Savage

拓展欧几里得入门题 两个野人若要走到同一个洞穴,设他们走了x步,则p[i]*x+c[i]≡p[j]*x+c[j](mod ans),ans即答案: 移项得到(p[i]-p[j])*X+ansY=c[j]-c[i]; 即aX+bY+=C的形式,枚举ans,n^2的枚举每一个野人,用ex_gcd求得最小解,看X是否在他们的生命时间内. 1 /************************************************************** 2 Problem: 1407 3

[NOI2002] 荒岛野人 扩展欧几里得算法

[问题描述] 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,-,M.岛上住着N个野人,一开始依次住在山洞 C1,C2,-,CN中,以后每年,第i个野人会沿顺时针向前走Pi个洞住下来.每个野人i有一个寿命值Li,即生存的年数.下面四幅图描述了一个有6个 山洞,住有三个野人的岛上前四年的情况.三个野人初始的洞穴编号依次为1,2,3:每年要走过的洞穴数依次为3,7,2:寿命值依次为4,3,1.     奇怪的是,虽然野人有很多,但没有任何两个野人在有生之年处在同一个