codeforces round#524 D - Olya and magical square /// 大概算是数学规律题?
题目大意:
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 /// 大概算是数学规律题?的更多相关文章
- 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 ...
- Codeforces Round #524 (Div. 2) D. Olya and magical square
D. Olya and magical square 题目链接:https://codeforces.com/contest/1080/problem/D 题意: 给出一个边长为2n的正方形,每次可以 ...
- 竞赛题解 - [CF 1080D]Olya and magical square
Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...
- Codeforces Round #524 (Div. 2) Solution
A. Petya and Origami Water. #include <bits/stdc++.h> using namespace std; #define ll long long ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- 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 ...
- [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 ...
- 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 ...
- Codeforces Round #524 (Div. 2) E. Sonya and Matrix Beauty(字符串哈希,马拉车)
https://codeforces.com/contest/1080/problem/E 题意 有一个n*m(<=250)的字符矩阵,对于每个子矩阵的每一行可以任意交换字符的顺序,使得每一行每 ...
随机推荐
- GO语言延迟函数defer用法分析
这篇文章主要介绍了GO语言延迟函数defer用法,较为详细的分析了GO语言的特性与具体用法,并给出了一个比较典型的应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例讲述了GO语言延迟 ...
- php 常用加密函数
md5()md5()默认情况下以 32 字符十六进制数字形式返回散列值,它接受两个参数,第一个为要加密的字符串,第二个为raw_output的布尔值,默认为false,如果设置为true,md5()则 ...
- tp U函数 logs
注意 U 函数 项目今天已经搞定了本以为可以上线了没问题了,但是 当我把tp调试模式关闭后: define('APP_DEBUG',false); 页面完全加载不出来,于是开启: 'SHO ...
- 10、jqueryEasyUI感觉自己还是改行做前端吧
1.jquery的局部方法开发 //首先引入jquery的相关包组件 <script type="text/javascript" src="../js/jquer ...
- 18、Linux命令对服务器CPU进行监控
我刚开始做性能测试的时候,什么也不懂,就只知道压测.什么时候把系统压瘫痪什么时候结束.但是系统因为什么瘫痪却不是很清楚,后来开始研究服务器性能监控,运用到工作中,提高了不少生产力,下面就把我常用的命令 ...
- leetcode-1053. 交换一次的先前排列
题目描述: 给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i]和 A[j] 的位置)后得到的.按字典序排列小于 A 的最大可能排列. 如果无法这么操 ...
- 拾遗:Git 与 Svn hook 不执行问题
要点: GIT 或 SVN 的 hook 执行之前,会将所有环境变量清空,因此在其中执行命令时,必须指定绝对路径或重新设置必要的环境变量,如:$HOME 等 修改为正确的名称,如:post-commi ...
- 20140725 快速排序时间复杂度 sTL入门
1.快速排序的时间复杂度(平均时间复杂度为) 数组本身就有序时,效果很差为O(n^2) 2.STl入门 (1) C++内联函数(inline)和C中宏(#define)区别 内联函数有类型检查,宏定义 ...
- 30-Ubuntu-用户权限-01-用户和权限的基本概念
1.用户 用户是Linux系统工作中重要的一环,用户管理包括用户和组管理. 在Linux系统中,不论是由本机或是远程管理登录系统,每个系统都必须拥有一个账号,并且对于不同的系统资源拥有不同的使用权限. ...
- 怎样在Cocos2d-x中使用Lua脚本
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...