博客
关于我
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/

    你可能感兴趣的文章
    NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
    查看>>
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    Numpy闯关100题,我闯了95关,你呢?
    查看>>
    nump模块
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    NUUO网络视频录像机 upload.php 任意文件上传漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVDIMM原理与应用之四:基于pstore 和 ramoops保存Kernel panic日志
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>