「Wdoi-3」夜雀 dreaming
题目背景
作为幻想乡食物链顶端的幽幽子,一直都是老板娘米斯蒂娅的噩梦!
尽管幽幽子一般而言是不会选择吃她的,但奈何日有所思夜有所梦,米斯蒂娅做了一个梦,一个交杂着幻想与现实的梦,或者说,那就是幻想中的现实……
尽管米斯蒂娅不知道这天什么时候会到来,但她不敢放松警惕,于是老板娘向你求助了……
题目描述
作为一道签到题,为了能让选手更好的发挥手速,米斯蒂娅决定提供这题的题意简述:隙间传送。
在梦中,幽幽子来到了夜雀餐厅。似乎是由于异变的影响,本来就贪吃的幽幽子此刻变得更加可怕。
米斯蒂娅一共会做 n n n 道菜,用来满足所有顾客的需求,并试图增加自己存活的概率。这些菜的编号为 0 , 1 , 2 0,1,2 0,1,2 直到 n − 1 n-1 n−1。同时,幽幽子会进行 k k k 次点餐。
- 本题中,我们记点菜事件为 order ( t , x ) \operatorname{order}(t,x) order(t,x) ,表示顾客向米斯蒂娅发起一份请求,希望她在 t t t 时刻制作并端上菜品 x x x 。
- 我们用一个三元组 ( t i , x i , y i ) (t_i,x_i,y_i) (ti,xi,yi) 描述幽幽子发起第 i i i 次点餐。在每次点餐中,幽幽子会发起 order ( t i , x i ) \operatorname{order}(t_i,x_i) order(ti,xi) 。然而幽幽子的欲望是不能被满足的。因此,当幽幽子在 t i t_i ti 时刻收到菜品时,会再次发起 order ( 2 ⋅ t i , ( x i + y i ) m o d n ) \operatorname{order}(2\cdot t_i,(x_i+y_i)\bmod n) order(2⋅ti,(xi+yi)modn) !更加不幸地,此过程会不断累加,接着她会发起 order ( 3 ⋅ t i , ( x i + 2 ⋅ y i ) m o d n ) \operatorname{order}(3\cdot t_i,(x_i+2\cdot y_i)\bmod n) order(3⋅ti,(xi+2⋅yi)modn) 乃至更多……
- 总而言之,幽幽子的第 i i i 次点餐 ( t i , x i , y i ) (t_i,x_i,y_i) (ti,xi,yi) 会执行这样的操作:
order ( j ⋅ t i , ( x i + ( j − 1 ) ⋅ y i ) m o d n ) ( j = 1 , 2 , 3 , ⋯ ) \operatorname{order}(j\cdot t_i,(x_i+(j-1)\cdot y_i)\bmod n)(j=1,2,3,\cdots) order(j⋅ti,(xi+(j−1)⋅yi)modn)(j=1,2,3,⋯)
由于幽幽子会发起无数次点餐请求,所以米斯蒂娅是不可能使她满足的。但为了不辜负大家的期望,米斯蒂娅决定竭尽全力拖延时间。作为老板娘,她有着超凡的厨艺:
- 每一个时刻,米斯蒂娅都能做出无限份菜,但菜只能是同一种类。
如果一个时刻幽幽子点的菜没能被立即做好(幽幽子并不愿意吃上一个时刻做好的菜哦),那么她就会大发雷霆,在这一时刻立即摧毁夜雀餐厅。米斯蒂娅想知道她能坚持多久(坚持多久指的是最多能坚持多少个时刻使得这些时刻内幽幽子不会摧毁餐厅,时刻从
1
1
1 开始计数)。如果她能坚持
996
1
9961
9961^{9961}
99619961 时刻或以上的话(在此题中,你可以认为
996
1
9961
9961^{9961}
99619961 是无穷大),请输出 Mystia will cook forever...
。
输入格式
第一行有两个整数 n , k n,k n,k ,含义如题面所示。
接下来 k k k 行,每行给定三个整数 ( t i , x i , y i ) (t_i,x_i,y_i) (ti,xi,yi) ,描述一组询问。
输出格式
共一行。输出米斯蒂娅最多能支撑多久,或者输出 Mystia will cook forever...
。
样例 #1
样例输入 #1
4 3
2 1 2
3 1 1
4 2 1
样例输出 #1
3
样例 #2
样例输入 #2
2 2
2 1 2
3 0 1
样例输出 #2
Mystia will cook forever...
提示
样例 1 解释
在时刻 4 4 4,幽幽子同时点了菜品 3 3 3 和菜品 2 2 2,于是夜雀餐厅会被摧毁,答案为 4 − 1 = 3 4-1=3 4−1=3。
数据范围及约定
KaTeX parse error: Expected a control sequence at position 5: \def{̲\arraystretch}{…
特殊性质 A \text{A} A :保证对于所有的 i i i ,满足 y i = 0 y_i = 0 yi=0 。
对于 100 % 100\% 100% 的数据,满足:
- 1 ≤ t i , n ≤ 1 0 9 1 \le t_i,n \leq 10 ^ 9 1≤ti,n≤109。
- 0 ≤ x i , y i ≤ 1 0 9 0 \le x_i,y_i \leq 10 ^ 9 0≤xi,yi≤109。
- 1 ≤ k ≤ 1000 1 \le k \leq 1000 1≤k≤1000。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e3+10;
int n, k, a[N];
struct node{
int t, x, y;
}tr[N];
bool cmp(node & a, node & b){
return a.t < b.t;
}
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a%b);
}
int main(){
cin >> n >> k;
for(int i = 1; i <= k; ++i){
cin >> tr[i].t >> tr[i].x >> tr[i].y;
}
sort(tr+1, tr+k+1, cmp);
long long ans = 1e18;
for(int i = 1; i <= k; ++i){
for(int j = 1; j <= i-1; ++j){
long long lc = 1ll*tr[i].t*tr[j].t/gcd(tr[i].t, tr[j].t);
//cout << lc << endl;
if((tr[i].x+(lc/tr[i].t-1)*tr[i].y%n) % n != ((tr[j].x+(lc/tr[j].t-1)*tr[j].y%n) % n)){
ans = min(ans, lc);
}
if((tr[i].x+(2*lc/tr[i].t-1)*tr[i].y%n) % n != ((tr[j].x+(2*lc/tr[j].t-1)*tr[j].y%n) % n)){
ans = min(ans, 2*lc);
}
}
}
if(ans != 1e18)cout << ans-1 << endl;
else cout << "Mystia will cook forever..."<< endl;
return 0;
}