tyvj 2017.9.16 test P4864 天天去哪吃 (模拟)
emmmmmm~
周日吃鸡吃的忘记改了
玩吃鸡的可以加我qq472715276
这回模拟赛不出所料的爆0了
不过tyvj的测评机真的很弱啊,提交一直在等待
感谢xd大佬的启发
问题描述:
吃饭是⾃古以来令⼈头疼的问题,最后天天决定写⼀个程序来替他做决
定。
现在已知有 n 个餐厅,编号从 0 到 n−1。记 ai 表⽰第 i 天决定吃什 么,令
ti0 = αai−1 + βai−2 mod n
tij = ti(j−1) + 1 mod n,j ≥ 1 天天不想连续⼏天吃⼀样的餐厅,所以如果在前⾯ ⌊n 2⌋ 天中吃过某个 餐厅,就不想再去这个餐厅。所以我们要找⼀个最⼩的 k,使得 tik 不为前 ⌊n 2⌋ 天去过的餐厅。那么天天第 i 天就想去 tik 餐厅。 现在已知 a1 和 a2,想让你输出 a3…am,即接下来 m−2 天天会去哪 ⾥吃饭。
【输入格式】 第⼀⾏两个整数 n 和 m。其中 2 ≤ n ≤ 100,000,3 ≤ m ≤ 200,000 第⼆⾏两个整数,分别为 α 和 β。其中 0 ≤ α,β ≤ 109 第三⾏两个整数,为 a1,a2。其中 0 ≤ a1,a2 < n,且 a1 ̸= a2
【输出格式】 ⼀⾏ m−2 个整数,表⽰接下来 m−2 天⾥,天天去哪⾥吃饭。
【样例输入】
3 4
2
7 11 2 0
【样例输出】
1 2
【样例解释】 t30 = 7a2 +11a1 mod n = 1,前⾯ ⌊n 2⌋ = 1 天没有出现,所以第三天去 1 号餐厅。 t40 = 1,前⾯ 1 天已经出现,所以第四天去 t41 = 2 号餐厅。
【数据规模和约定】 对于 60% 的数据,2 ≤ n,m ≤ 10,000。 对于 100% 的数据,2 ≤ n ≤ 100,000,3 ≤ m ≤ 200,000,且保证 α,β 为随机选择的两个素数,所以可以认为 ti0 为⼀个随机数。
这道题是跟着模拟就行了
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #define ll long long using namespace std; const int maxn = 200005; template <typename T>void read(T&x ) //快读防超时 { x = 0;char c;int sign = 1; do { c = getchar(); if(c == '-') sign = -1; }while(c < '0' ||c > '9'); do { x = x* 10 + c - '0'; c = getchar(); }while(c <= '9' && c >= '0'); x *= sign; } ll a,b,a1,b1,n,m,n1,now,t = 1,t1 = 0; //不开long long只有60分 ll s[maxn]; bool f[maxn]; //标记 int main(){ read(n);read(m); read(a);read(b); read(b1);read(a1); f[a1] = 1;f[b1] = 1; //标记读入的两个店 s[0] = b1;s[1] = a1; //标记1,2天去的点 n1 = n/2; //n/2天 for(int i = 3;i <= m;i++){ now = (a*a1 + b*b1)%n; //当天去的店 if(t - t1 >= n1) f[s[t1++]] = 0; //判断是否之前去过取消n/2天前的标记 while(f[now]) now = (++now)%n; //如果去过就去下一家 之前写的now++一直超时 s[++t] = now;f[now] = 1; //将那天的店进入数组,标记去的店 printf("%lld ",now); b1 = a1;a1 = now; } return 0; }

浙公网安备 33010602011771号