【数学 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

Sample Output

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


题目分析

注意到$n$很小且保证$M≤10^6$,自然想到枚举答案对不对!其实枚举答案的复杂度是不对的但是就是可过(因为$n^2$的验证大多数情况达不到上界;出题人的本意大概也是枚举吧)

$O(M)$枚举答案之后考虑如何验证。两个野人当总洞穴数为$M‘$时在有生之年相遇即$C_i+time*P_i≡C_j+time*P_j(modM‘)$,其中$time≤min\{L_i,L_j\}$。那么这个式子就可以展开后作为不定方程求解了。注意最后要将特解变化为最小正整数解。

这里要说的时,求解不定方程时,即使部分会出现负数情况,也不能够乱加$abs()$!因为符号的正负性在之后的方程中会被负负得正或保持符号。唯一要$abs()$的就是最后求最小正整数解时的变换。

哦这题枚举答案还要从$mx$开始,因为有部分情况会出现$M‘<mx$在表达式上合法的情况。

 1 #include<bits/stdc++.h>
 2
 3 int n,c[23],p[23],l[23],mx;
 4
 5 void exgcd(int a, int b, int &x, int &y)
 6 {
 7     if (b==0){
 8         x = 1, y = 0;
 9         return;
10     }
11     exgcd(b, a%b, y, x);
12     y -= a/b*x;
13 }
14 int gcd(int x, int y){return y==0?x:gcd(y, x%y);}
15 int abs(int x){return x>0?x:-x;}
16 bool able(int ts)
17 {
18     register int i,j,ci,cj,pi,pj,lt,d,mt;
19     for (i=1; i<=n; i++)
20         for (j=i+1; j<=n; j++)
21         {
22             int x,y;
23             ci = c[i], cj = c[j], pi = p[i], pj = p[j], lt = std::min(l[i], l[j]);
24             d = gcd(pi-pj, ts);
25             if ((cj-ci)%d) continue;
26             exgcd(pi-pj, ts, x, y);
27             mt = abs(ts/d), x = ((x*(cj-ci)/d)%mt+mt)%mt;
28             if (x <= lt) return 0;
29         }
30     return 1;
31 }
32 int main()
33 {
34     scanf("%d",&n);
35     for (int i=1; i<=n; i++) scanf("%d%d%d",&c[i],&p[i],&l[i]), mx = mx>c[i]?mx:c[i];
36     for (int m=mx; m<=1000000; m++)
37         if (able(m)){
38             printf("%d\n",m);
39             return 0;
40         }
41     return 0;
42 }

END

原文地址:https://www.cnblogs.com/antiquality/p/9367488.html

时间: 2024-10-10 15:40:13

【数学 exgcd】bzoj1407: [Noi2002]Savage的相关文章

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

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

[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

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

【BZOJ1408】[Noi2002]Robot DP+数学

[BZOJ1408][Noi2002]Robot Description Input Output Sample Input 3 2 1 3 2 5 1 Sample Output 8 6 75 HINT 90号机器人有10个老师,加上它自己共11个.其中政客只有15号:军人有3号和5号:学者有8个,它们的编号分别是:2,6,9,10,18,30,45,90. 题解:语文题,就是问你n的约数中μ(d)=0,1,-1时,φ(d)的和,其中令μ(1)=0,φ(2)=0 直接DP,令f[i][0/1]

BZOJ_1408_[Noi2002]Robot_数学

Description Input Output Sample Input 3 2 1 3 2 5 1 Sample Output 8 6 75 HINT 90号机器人有10个老师,加上它自己共11个.其中政客只有15号:军人有3号和5号:学者有8个,它们的编号分别是:2,6,9,10,18,30,45,90. $\sum\limits_{d|n}\mu(d)=n$ 因此总和为n. 只需要求约数中$\mu$为1的$\varphi$和,$\mu$为-1的$\varphi$和. 这样,我们每个质因子