【洛谷】P2421 [NOI2002]荒島野人
阿新 • • 發佈:2020-08-17
傳送門
題目描述
克里特島以野人群居而著稱。島上有排列成環行的m個山洞。這些山洞順時針編號為1,2,…,m。島上住著n個野人,一開始依次住在山洞C_1,C_2,…,Cn中,以後每年,第i個野人會沿順時針向前走Pi個洞住下來。
每個野人i有一個壽命值Li,即生存的年數。
下面四幅圖描述了一個有6個山洞,住有三個野人的島上前四年的情況。三個野人初始的洞穴編號依次為1,2,3;每年要走過的洞穴數依次為3,7,2;壽命值依次為4,3,1。
奇怪的是,雖然野人有很多,但沒有任何兩個野人在有生之年處在同一個山洞中,使得小島一直保持和平與寧靜,這讓科學家們很是驚奇。他們想知道,至少有多少個山洞,才能維持島上的和平呢?
輸入格式
第1行為一個整數n(1≤n≤15),即野人的數目。
第2行到第N+1每行為三個整數Ci, Pi, Li (1≤ Ci,Pi ≤100, 0≤ Li ≤ 10^6 ),表示每個野人所住的初始洞穴編號,每年走過的洞穴數及壽命值。
輸出格式
僅包含一個數M,即最少可能的山洞數。輸入資料保證有解,且M不大於10^6。
輸入輸出樣例
輸入 #1 3 1 3 4 2 7 3 3 2 1 輸出 #16說明/提示
1≤N≤15,1≤Ci,Pi≤100,0≤Li≤10^6
保證M≤10^6
1 #include<iostream> 2#include<cstring> 3 #include<cstdio> 4 #include<sstream> 5 #define Mod 19260817 6 using namespace std; 7 int X,Y; 8 int Min(int XX,int YY){ 9 if(XX>YY) return YY; 10 return XX; 11 } 12 struct node{ 13 int c,p,l; 14 }wild_man[10001]; 15 int exgcd(int a,int b){ 16 if(b==0){ 17 X=1; 18 Y=0; 19 return a; 20 } 21 int gg=exgcd(b,a%b),t=X; 22 X=Y; 23 Y=t-(a/b)*Y; 24 return gg; 25 } 26 int check(int cave,node x,node y){ 27 int A=y.p-x.p; 28 int B=cave; 29 int C=x.c-y.c; 30 int gcd=exgcd(A,B); 31 if(C%gcd!=0) return true; 32 A/=gcd,B/=gcd,C/=gcd; 33 if(B<0) B=-B; 34 X=(X*C%B+B)%B; 35 if(X>Min(x.l,y.l)) return true; 36 return false; 37 } 38 int main(){ 39 int n; 40 cin>>n; 41 int T=0; 42 for(int i=1;i<=n;i++){ 43 cin>>wild_man[i].c>>wild_man[i].p>>wild_man[i].l; 44 if(T<wild_man[i].c) T=wild_man[i].c; 45 } 46 T--; 47 while(T<=1000000){ 48 T++; 49 int flag=0; 50 for(int i=1;i<=n;i++){ 51 for(int j=1;j<i;j++){ 52 if(check(T,wild_man[i],wild_man[j])==false){ 53 flag=1; 54 break; 55 } 56 } 57 if(flag==1) break; 58 } 59 if(flag==1) continue; 60 cout<<T<<endl; 61 break; 62 } 63 64 }