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. django开发傻瓜教程-3-celery异步处理

    Ref: https://www.jianshu.com/p/6f8576a37a3e https://blog.csdn.net/Demo_3/article/details/78119951 ht ...

  2. discuzX3.2 X3.4网站漏洞修复 SQL注入与请求伪造攻击利用与修复

    2018年12月9日,国内某安全组织,对discuz X3.2 X3.4版本的漏洞进行了公开,这次漏洞影响范围较大,具体漏洞是discuz 的用户前段SQL注入与请求伪造漏洞,也俗称SSRF漏洞,漏洞 ...

  3. SKIP(插入空行)

    WRITE 'This is the 1st line'. SKIP. WRITE 'This is the 2nd line'. 跳转至某一行 SKIP TO LINE line_number. 插 ...

  4. Spring中的设计模式--观察者模式

    spring在容器中使用了观察者模式: 一.spring事件:ApplicationEvent,该抽象类继承了EventObject类,jdk建议所有的事件都应该继承自EventObject. 二.s ...

  5. Java线程和多线程(十)——TimerTask

    Java中的java.util.Timer是一个工具类,可以用于调度一个线程在将来的某一个时刻执行特定的任务.Java Timer类可以将一个任务定时执行一次,或者是以后以每隔一定的时间间隔来触发一次 ...

  6. 关于springboot 打包问题 jar包和 war包

    起因:项目开发完成   需要打包部署了  发现自己不会打包 那么开始网上学习打包? 那么怎么来打包那? 我们以前没有采用springboot 时候我们都是直接将项目打成war包形式  然后放到tomc ...

  7. Mysql 启动运行

    MYSQL默认端口:3306用户: root   也可自己添加用户启动数据库服务名: MYSQL (在安装的时候会设置) 在开始菜单栏->附件->右键命令提示符->以管理员身份运行: ...

  8. Bug是一种财富-------研发同学的错题集、测试同学的遗漏用例集

    此文已由作者王晓明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 各位看官,可能看到标题的你一定认为这是一篇涉嫌"炒作"的文章,亦或是为了吸引眼球而起的标 ...

  9. 虚拟现实-VR-UE4-编译源代码后,无法运行

    情况是这个样,在一开始我编译后,是可以运行,但是当我重新做系统后,再次运行时,每次都是到加载的18%的时候提示了如下错误 具体解决方法还没有找到,正在努力找中.........,会后续更新 同时希望有 ...

  10. Fiddler 4 实现手机App的抓包

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的HTTP/HTTPS请求. Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook ...