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;
}             

 

转载于:https://www.cnblogs.com/breast/p/7544040.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值