D. Olya and magical square

题目链接https://codeforces.com/contest/1080/problem/D

题意:

给出一个边长为2n的正方形,每次可以将其划分,要求划分出来从左下角到右上角沿着左边和上边的边走的路径的小正方形边长相等。现在有k个划分的机会,问是否能把k次机会用完(当边长为1时则不能划分了),如果可以,输出路径上的小正方形的边长长度。

题解:

这题看题解看了半天,最终应该说是搞懂了...

首先,划分思路是这样的,先划分一下成四块,然后每次划分都划分路径上面的正方形,等到路径正方形边长为1了,就随意划分其它的正方形了。

先判断可行性,我们知道,边长为2n的正方形最多只能划分(4n-1)/3次,由于k<=1018,所以当n>30时,必定k是可以用完的。最终,只要(4n-1)/3<k,就不能将划分次数用完。这里分n>30和n<=30是因为数据太大了,这样可以避免求4n时溢出。

当k可以用完时,我们再来看,我们就以上面说的划分思路来划分。

首先,划分一次变为四个正方形;

然后,对路径上面的正方形进行划分,每次全部划分需要消耗2i+1-1个划分次数。假设我们在第x次时,有k<2x+1-1,也就是说对路径上的正方形进行x-1轮划分过后,不能进一步划分,通过这里可以推出x-1<=n-1即x<=n。现在再来看右下角这个边长为2n-1的正方形,容易知道它最多划分(4n-1-1)/3次。

又2x+1-1<=2n+1-1,令(4n-1-1)/3>=2n+1-1,解得n>=5,也就是说当n>=5时,必定可以成功划分。(想一想为什么)

假定n>=3,那么会多出来5个边长为2n-2的小正方形,现在有5*(4n-2-1)/3+(4n-1-1)/3>=2n+1-1,可以解得n>=4,进一步推出n>=4时可以成功划分。

假定n=3,那么最多可以划分21次,减去一次就是20次,根据划分思路,最右下角的正方形可以划分5次,边长为2的正方形有5个,最终也是划分五次。划分路径上的正方形最多是十次。结合这个,当k取1-21之间的任意数时,都可以成功划分。(想一想,为什么)

综上,当n>=3时,当k能被用尽的情况下,必然能够满足条件(成功划分),使得路径上的小正方形边长相等。

我们再来分析n=2的情况,易知当k=3时,不能成功划分,其余都可以。

对于n=1,就不用说了。

综上,首先判断k次划分机会是否能用完,然后除开n=2,k=3的特例,根据划分思路进行划分。

Update:

后来又想了一下,可以把这个简化一下,比如现在我们对于左边和右边的正方形划分了x-1次,那么划分的总次数就为22-1+23-1+...+2x-1=2x+1-3-x次,对于右下角的正方形划分总次数至少也可以为

(4x-1-1)/3,现在还是有k<2x+1-1。

令2x+1-3-x+(4x-1-1)/3>=2x+1-1解得x>=3。

即当操作了x-1>=2次之后,k都能被用尽,加上之前划分的那一次,就是3次。

最终可以得出,当n>=3时,k都能够被用尽,就不用像我之前那么麻烦了,最后单独看一下n=1,n=2的情况就ok了。

代码如下:

#include <bits/stdc++.h>
using namespace std; typedef long long ll ; ll pathl(ll n,ll k){
k--;
ll pow2 = ,cnt = ;
while(k>=pow2-){
cnt++;
k-=(pow2-);
pow2*=;
}
return max(n--cnt,(ll));
}
int main(){
ll t,n,k;
cin>>t;
while(t--){
cin>>n>>k;
if(n== && k==){
puts("NO");continue ;
}
ll pow4=,tmp1=k,tmp2=n;
if(n<=){
while(tmp2--){
tmp1-=pow4;
pow4*=;
}
if(tmp1>){
puts("NO");continue;
}
printf("YES %d\n",pathl(n,k));
}else{
printf("YES %d\n",pathl(n,k));
}
} return ;
}

总得来说,这题的关键就是划分思路,其余都可以推导出来。

Codeforces Round #524 (Div. 2) D. Olya and magical square的更多相关文章

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

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

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

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

  3. Codeforces Round #877 (Div. 2) D. Olya and Energy Drinks

    题目链接:http://codeforces.com/contest/877/problem/D D. Olya and Energy Drinks time limit per test2 seco ...

  4. 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 ...

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

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

  6. Codeforces Round #524 (Div. 2) C. Masha and two friends(矩形相交)

    C. Masha and two friends time limit per test 1 second memory limit per test 256 megabytes input stan ...

  7. Codeforces Round #524 (Div. 2) B. Margarite and the best present

    B. Margarite and the best present 题目链接:https://codeforces.com/contest/1080/problem/B 题意: 给出一个数列:an=( ...

  8. Codeforces Round #524 (Div. 2) codeforces 1080A~1080F

    目录 codeforces1080A codeforces 1080B codeforces 1080C codeforces 1080D codeforces 1080E codeforces 10 ...

  9. Codeforces Round #524 (Div. 2)C 二维坐标系求俩矩形面积交

    题:https://codeforces.com/contest/1080/problem/C 题意:给n*m的二维坐标系,每个位置(xi,yi)都表示一个方格,(1,1)的位置是白色,整个坐标系黑白 ...

随机推荐

  1. Table被web编程弃用的原因

    Table要比其它html标记占更多的字节. (延迟下载时间,占用服务器更多的流量资源.)Tablle会阻挡浏览器渲染引擎的渲染顺序. (会延迟页面的生成速度,让用户等待更久的时间.)Table里显示 ...

  2. C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误

    FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...

  3. Odoo8中安装新模块找不到的问题

    为了要让系统识别出新的模块,我们需要打开用户的技术特性选项,具体在    左侧栏目->用户->administrator,  将技术特性勾选上,刷新.  然后左侧栏目->模块下面就会 ...

  4. AWS安装CDH5.3-CentOS6.4中关键操作步骤

    1.在AWS masternode 上下载cloudera-manager-installer.bin安装包 [root@ip-172-21-42-114 ~]# wget http://archiv ...

  5. MyEclipse - 问题集 - Java compiler level does not match the version of the installed Java project facet

    右键项目“Properties”,在弹出的“Properties”窗口左侧,单击“Project Facets”,打开“Project Facets”页面. 在页面中的“Java”下拉列表中,选择相应 ...

  6. Lambda方式左连接有Linq方式左连接

    网上查到的直接使用Join+DefaultIfEmpty的方式是错误的,实际生成SQL是两表先内联接,然后再LEFT JOIN.经过查证,参考资料,最终得到如下两种方式的左连接写法: public v ...

  7. OBS源码编译开发

    本文来自网易云社区 作者:梁敏 OBS简介 OBS(Open Broadcaster Software)是免费开源的视频录制和直播软件,支持运行在windows,Mac和linux平台.官方链接 ht ...

  8. Oracle11.2.0.3 RAC配置ODBC成功案例记录

    最终使用字符串如下: String url="jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = scan- ...

  9. Python中该使用%还是format来格式化字符串?

    %还是format 1.皇城PK Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是fo ...

  10. webpack使用时可能出现的问题

    1.在配置完webpack.config.js准备进行热加载开发时,修改React内容浏览器不会自动局部刷新,而且会console出一些提示: The following modules couldn ...