今晚 ABC 的 E 求调
  • 板块学术版
  • 楼主FXT1110011010OI
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/23 22:03
  • 上次更新2023/11/2 18:25:35
查看原帖
今晚 ABC 的 E 求调
518899
FXT1110011010OI楼主2023/9/23 22:03

第一个样例能过,第二个过不去QAQ

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

LL n, depn;

LL power(LL a, LL b)
{
    if (b < 0) return 0;
    LL res = 1;
    while (b -- ) res *= a;
    return res;
}

LL calc(LL x, LL dep, LL k)
{
    if (dep + k < depn) return power(2, k);
    else if (dep + k == depn)
    {
        LL id = x - power(2, dep - 2), mb = power(2, k), di = n - power(2, depn - 1) + 1;
        if ((di + mb - 1) / mb < id) return 0;
        else if ((di + mb - 1) / mb == id) return di % mb;
        else return mb;
    }
    else return 0;
}

int main()
{
    LL T;
    scanf("%lld", &T);
    for (LL i = 1; i <= T; i ++ )
    {
        LL x, k;
        scanf("%lld%lld%lld", &n, &x, &k);
        if (!k)
        {
            printf("1\n");
            continue;
        }
        LL depx = (LL)log2(x) + 1, bd = depx, bk = k;
        depn = (LL)log2(n) + 1;
        LL res = 0;
        res += calc(x, depx, k); k -= 2;
        if (x + 1 <= n && k >= 0) res += calc(x + 1, depx, k);
        if (k >= 0) k -- ;
        x /= 2;
        while (depx >= 1 && k >= 0 && x / 2 > 0)
        {
            res += calc(x, depx, k);
            depx -- , k -- , x /= 2;
        }
        if (bd - bk >= 1) res ++ ;
        printf("%lld\n", res);
    }
    return 0;
}
2023/9/23 22:03
加载中...