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

    你可能感兴趣的文章
    mysql case when 乱码_Mysql CASE WHEN 用法
    查看>>
    Multicast1
    查看>>
    MySQL Cluster 7.0.36 发布
    查看>>
    Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
    查看>>
    multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
    查看>>
    mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
    查看>>
    Multiple websites on single instance of IIS
    查看>>
    mysql CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    mysql id自动增长 初始值 Mysql重置auto_increment初始值
    查看>>
    MySQL in 太多过慢的 3 种解决方案
    查看>>
    Mysql Innodb 锁机制
    查看>>