博客
关于我
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和redis之间互相备份
    查看>>
    MySQL和SQL入门
    查看>>
    mysql在centos下用命令批量导入报错_Variable ‘character_set_client‘ can‘t be set to the value of ‘---linux工作笔记042
    查看>>
    Mysql在Linux运行时新增配置文件提示:World-wrirable config file ‘/etc/mysql/conf.d/my.cnf‘ is ignored 权限过高导致
    查看>>
    Mysql在Windows上离线安装与配置
    查看>>
    MySQL在渗透测试中的应用
    查看>>
    Mysql在离线安装时启动失败:mysql服务无法启动,服务没有报告任何错误
    查看>>
    Mysql在离线安装时提示:error: Found option without preceding group in config file
    查看>>
    MySQL基于SSL的主从复制
    查看>>
    Mysql基本操作
    查看>>
    mysql基本操作
    查看>>
    mysql基本知识点梳理和查询优化
    查看>>
    mysql基础
    查看>>
    Mysql基础 —— 数据基础操作
    查看>>
    mysql基础---mysql查询机制
    查看>>
    MySQL基础5
    查看>>
    MySQL基础day07_mysql集群实例-MySQL 5.6
    查看>>
    Mysql基础命令 —— 数据库、数据表操作
    查看>>
    Mysql基础命令 —— 系统操作命令
    查看>>
    MySQL基础学习总结
    查看>>