题目大意:

t 个测试用例  (1≤t≤103)

给定n k  (1≤n≤10^9,1≤k≤10^18)

表示有一个边长为2^n的正方形格子 每次操作只能将一个格子切割为左上左下右上右下的四等分格子

问进行k次四等分切割后 能否使得 左下角的格子的边长 和 右上角的格子的边长 相等

并且存在一条左下角格子到右上角格子的路径上 经过的格子的边长 也和它们相等

若可以输出 “YES 切割后的log2(边长)” 若操作次数用不完输出“NO”

首先

对边长为2^1的格子四等分切割为1*1小格需要         1          次操作

对边长为2^2的格子四等分切割为1*1小格需要   1*4+1=5   次操作

对边长为2^3的格子四等分切割为1*1小格需要  5*4+1=21  次操作

......op[ i ] = op[ i-1 ] * 4 + 1

由此可预处理出边长为 2^i 的格子切割为1*1小格 需要 op[i] 次操作

然后我们可以发现当切割边长为2^31的格子时 op[31] 即操作次数超出了k的范围10^18

(k最大时不足以将一个2^31边长的格子切为1*1小格)

假设 边长为2^32时 先进行一次操作(分为四格2^31) 剩k-1次操作

之后只对右下的2^31的一格切割 那么k-1次操作绝对能用完

所以路径由左下经左上到右上 经过的三格的边长一样都是2^31 即输出log2(2^31)=31

以此类推 >31 的情况 只要这么处理 答案就是 n-1

n<=31时 ​考虑只切我们要走的路径的格子(假设我们走左边和上边的边缘圈的格子)

每次只对边缘圈的格子切割一次

第一次需要切割 1 格 (即切1次) (路径格子边长减为 2^(n-1) )

第二次需要切割 3 格 (即切3次) (路径格子边长减为 2^(n-2) )

第三次需要切割 7 格 (即切7次) (路径格子边长减为 2^(n-3) )

......

每次递推可得到下次需要切割的格子数 now(下次) = now(本次) * 2 + 1

累加得到边缘圈应切割次数 tot += now

但是仅仅只切割外围 k次操作很可能还是用不完的

那么此时我们考虑每次切割后不会成为外围圈的格子

因为它们不会影响到我们要走的路径 所以可以直接把它们切成1*1的小格

第一次红色格子可切割 共需切割次数 op[ n-1 ] * (3-2)

第二次绿色格子可切割 共需切割次数 op[ n-2 ] * (7-2)

第三次青色格子可切割 共需切割次数 op[ n-3 ] * (15-2)

.....(由于恰好对应下次切割要切割的外围圈格子往内的一圈 往内一圈会少两格 所以恰好是 now(下次)-2 格)

累加得到额外可切割次数 re

那么当只切外围圈的操作数 tot >= k 时 可得到答案

或者 当切外围也切内圈 tot+re>=k 时 也可得到答案

否则 k次操作 就不可能被用完

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,op[];
int main(){
for(int i=;i<=;i++) op[i]=op[i-]*4LL+1LL;
int t; scanf("%d",&t);
while(t--){
scanf("%I64d%I64d",&n,&k);
if(n>) {
printf("YES %I64d\n",n-);
continue;
}
ll tot=,now=,j=,re=;
while(now+tot<=k&&j<n){
tot+=now;
now=now*+; // now更新为下轮操作需要操作的边缘圈的格数
j++; // 对边缘圈的小格各操作一次 那么每格的边长又小了一半 即由2^(n-j)变为2^(n-(j+1))
re+=op[n-j]*(now-);
}
if(k>tot+re) printf("NO\n"); // 全部切到1*1小格的操作次数tot+re 仍然不够k次
else printf("YES %I64d\n",n-j); // n-j 即缩小到最后的 log2(边长)
}
return ;
}

codeforces round#524 D - Olya and magical square /// 大概算是数学规律题?的更多相关文章

  1. Codeforces Round #384 (Div. 2) B. Chloe and the sequence(规律题)

    传送门 Description Chloe, the same as Vladik, is a competitive programmer. She didn't have any problems ...

  2. Codeforces Round #524 (Div. 2) D. Olya and magical square

    D. Olya and magical square 题目链接:https://codeforces.com/contest/1080/problem/D 题意: 给出一个边长为2n的正方形,每次可以 ...

  3. 竞赛题解 - [CF 1080D]Olya and magical square

    Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...

  4. Codeforces Round #524 (Div. 2) Solution

    A. Petya and Origami Water. #include <bits/stdc++.h> using namespace std; #define ll long long ...

  5. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  6. Codeforces 715A & 716C Plus and Square Root【数学规律】 (Codeforces Round #372 (Div. 2))

    C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. [Codeforces Round #247 (Div. 2)] A. Black Square

    A. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)

    https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...

  9. Codeforces Round #524 (Div. 2) E. Sonya and Matrix Beauty(字符串哈希,马拉车)

    https://codeforces.com/contest/1080/problem/E 题意 有一个n*m(<=250)的字符矩阵,对于每个子矩阵的每一行可以任意交换字符的顺序,使得每一行每 ...

随机推荐

  1. 使用redis实现客户端和服务端token验证

    实在是思维江化啊,没有想到可以给redis设置不同的key值来实现不同key值存储不同的value值,而一直想着给一个名为token的key值新增不同的数据,并设置过期时间,然而这样却不能新增只能做到 ...

  2. PHP面试 PHP基础知识 二(常量及数据类型)

    常量及数据类型 PHP八种数据类型 四种标量类型 字符串(string).布尔(boolean).浮点(float/double).整型(integer) 两种复合类型 数组(array).对象(ob ...

  3. Java 并发理论简述

    一:为什么需要多线程? 线程是Java语言中不可或缺的重要部分,它们能使复杂的异步代码变得简单,简化复杂系统的开发:能充分发挥多处理器系统的强大计算能力.多线程和多进程的区别与选择可以参考我的另一篇博 ...

  4. JQuery中内容操作函数、validation表单校验

    JQuery:内容体拼接(可以直接拼接元素节点和内容节点) JQuery实现: 方案1:A.append(B); == B.appendTo(A);A的后面拼接B 方案2: A.prepend(B); ...

  5. Python的一些列表方法

    1.append:方法append用于将一个对象附加到列表末尾,直接修改列表 lst=[1,2,3,4] lst.append(5) print(lst) 1,2,3,4,5 2.clear:方法cl ...

  6. python输入一个\输出2个\问题

    在Python里面,如果\后面不是一个合法的转移字符,那么,Python会打印两个\,换句话说,Python将\也当成普通字符看待,而不是转义符的标志: >>>S = 'C:\py\ ...

  7. vue 路由传参中刷新页面参数丢失 及传参的几种方式?

    在页面跳转中,我通过路由传参,结果发现页面参数丢失了.路径返回了根目录.... 1. 先说下路由传参的几种方式吧? 比如:<div v-for="item in items" ...

  8. Spring-boot整合Redis,遇到的问题

    1.通过set进redis中的数据,get不到 String cityKey ="city_"+id; ValueOperations<String,City> ope ...

  9. Kettle使用kettle.properties

    kettle.properties 是一个变量文件,这个文件我使用的最多的地方是保存 “数据库连接” 用户名和密码. 如果不用这个文件,那么使用“数据库连接”时,需要硬编码写到文件里. 有一天dba告 ...

  10. 2019-7-15-WPF-测试触摸设备发送触摸按下和抬起不成对

    title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 lindexi 2019-7-15 9:3:51 +0800 2019-0 ...