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

本文共 1819 字,大约阅读时间需要 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及以上版本
    查看>>
    netbeans生成的maven工程没有web.xml文件 如何新建
    查看>>
    netcat的端口转发功能的实现
    查看>>
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>
    netsh advfirewall
    查看>>
    NETSH WINSOCK RESET这条命令的含义和作用?
    查看>>
    netstat命令用法详解
    查看>>
    Netstat端口占用情况
    查看>>
    Netty WebSocket客户端
    查看>>
    netty 主要组件+黏包半包+rpc框架+源码透析
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    netty之 定长数据流处理数据粘包问题
    查看>>
    Netty事件注册机制深入解析
    查看>>
    Netty入门使用
    查看>>
    Netty原理分析及实战(三)-高可用服务端搭建
    查看>>