博客
关于我
codeforces1080D 2000分数学
阅读量:291 次
发布时间:2019-03-03

本文共 1868 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要判断是否可以从左下角走到右上角,经过的正方形大小相同,并且只能向上或向右走。我们需要高效地处理大数范围,并确保计算不会溢出。

方法思路

  • 问题分析

    • 给定一个大小为 (2^n \times 2^n) 的正方形,需要进行 (k) 次操作。
    • 每次操作将一个 (a \times a) 的正方形切割成4个 ((a/2 \times a/2)) 的小正方形。
    • 我们需要判断是否存在一条从左下到右上的路径,且路径上的每个正方形大小相同。
  • 关键观察

    • 当 (n \geq 32) 时,一定有解,且路径上的正方形边长为 (2^{n-1})。
    • 当 (n \leq 31) 时,需要详细计算每个可能的路径分割次数,判断 (k) 是否满足条件。
  • 算法选择

    • 预先计算所有可能的分割次数和总次数。
    • 使用循环遍历每个可能的路径分割次数,判断 (k) 是否在允许范围内。
  • 复杂度分析

    • 时间复杂度:对于 (n \leq 31),遍历次数为 (O(n)),每次遍历的时间复杂度为 (O(n)),总时间复杂度为 (O(n^2))。
    • 空间复杂度:使用 (O(1)) 内存存储必要的计算结果。
  • 解决代码

    #include 
    using namespace std;
    ll pow2(int x) {
    return static_cast
    (1 << x);
    }
    ll sum1(int i) {
    return (pow2(i + 1) - 2) - i;
    }
    ll sum2(int m) {
    ll res = 0;
    for (int j = 1; j <= m; ++j) {
    res += pow2(2 * (j - 1));
    }
    return res;
    }
    int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
    ll n, k;
    scanf("%lld%lld", &n, &k);
    if (n >= 32) {
    printf("YES %lld\n", n - 1);
    continue;
    }
    ll sum1_n = sum1(n);
    bool flag = false;
    int temp;
    for (int i = 1; i <= n; ++i) {
    ll s = sum1(i);
    if (s > k)
    continue;
    int m = n - i;
    ll t_sum = sum2(m);
    ll power = pow2(i + 1) - 1;
    ll t = t_sum * power;
    ll target = sum1_n - t;
    if (k <= target && k >= s) {
    flag = true;
    temp = i;
    break;
    }
    }
    if (flag) {
    printf("YES %d\n", temp);
    } else {
    printf("NO\n");
    }
    }
    return 0;
    }

    代码解释

  • 函数定义

    • pow2(int x) 计算 (2^x)。
    • sum1(int i) 计算路径上的分割次数。
    • sum2(int m) 计算总分割次数。
  • 主函数

    • 读取输入,处理每个测试用例。
    • 对于 (n \geq 32),直接输出结果。
    • 对于 (n \leq 31),遍历每个可能的路径分割次数,判断 (k) 是否在允许范围内。
  • 遍历逻辑

    • 计算每个路径分割次数的范围。
    • 检查 (k) 是否在范围内,存在则输出结果。
  • 该方法高效地处理了大数范围,并确保了计算的正确性和效率。

    转载地址:http://fuml.baihongyu.com/

    你可能感兴趣的文章
    NetApp凭借领先的混合云数据与服务把握数字化转型机遇
    查看>>
    NetBeans IDE8.0需要JDK1.7及以上版本
    查看>>
    netcat的端口转发功能的实现
    查看>>
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>
    netsh advfirewall
    查看>>
    NETSH WINSOCK RESET这条命令的含义和作用?
    查看>>
    Netty WebSocket客户端
    查看>>
    netty 主要组件+黏包半包+rpc框架+源码透析
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty事件注册机制深入解析
    查看>>
    Netty原理分析及实战(四)-客户端与服务端双向通信
    查看>>
    Netty客户端断线重连实现及问题思考
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0007---NIO的三大核心组件关系
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0013---Channel应用案例4Copy图片
    查看>>