Codeforces Round #469 (Div. 2) D

前言

巨难受
本来以为可以上紫的
但是Efail了。。
于是只上了12分。。
我已经在1880+卡了四场比赛了。。
这次就不写整场题解了
写一题吧
我的rat是长这样的。。
看来还是实力不够啊
这里写图片描述

题解

我们考虑一下第i位是怎么来的
如果他是奇数位,那么显然地,肯定没有动过
如果他是偶数位,那他是怎么来的呢?
肯定是别的跳过来的,那是从哪里跳过来的呢
容易知道,当我们要跳到某一个偶数位的时候,一定是长成这样的
这里写图片描述
黄色代表有数字
然后第F位肯定是从第L位跳过来的
可以知道,F位之前有i/2个数
那么后面就是n-i/2了
那么他就是从i+(n-i/2)=n+i/2这个地方跳过来
跳到奇数就停下来
这样的话每一次会扩大1.5倍
指数函数的力量啊

CODE:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL n,q;
int main()
{
    scanf("%I64d%I64d",&n,&q);
    while (q--)
    {
        LL x;
        scanf("%I64d",&x);
        while (x%2==0)
        {
            x=n+(x/2);
        }
        printf("%I64d\n",(x+1)/2);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值