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. python 面向对象 (多态)

    什么是多态?多态就像是人有多种心情,场景不一样心情就会不一样. class Dog: def print_self(self): print('this is dog') class Hsq(Dog) ...

  2. MOVE-PERCENTAGE(文字列の部分の代入)

    以下の MOVE 命令のバリアントは.c 型項目についてのみ機能します. MOVE c1 TO c2 PERCENTAGE p [RIGHT]. 左寄せした (RIGHT オプションを指定した場合は右 ...

  3. python--基本类型之列表

    Lest(列表): 定义和创建列表: 列表:是python以及其他语言中最常用的数据结构之一.python用 [] 来解析列表列表是可变的.--可以改变列表的内容可以用切片 a=['张三','李四', ...

  4. 对mysqlbinlog日志进行操作的总结包括 启用,过期自动删除

    操作命令: show binlog events in 'binlog.000016' limit 10; reset master 删除所有的二进制日志 flush logs  产生一个新的binl ...

  5. DDoS 攻击与防御:从原理到实践(下)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. DDoS 攻击与防护实践 DDoS 攻击的实现方式主要有如下两种: 自建 DDoS 平台 现在有开源的 DDoS 平台源代码,只要有足够机器和带宽资 ...

  6. 「日常训练」 Soldier and Cards (CFR304D2C)

    题意 (Codeforces 546C) 按照指定的规则打牌,问谁胜或无穷尽. 分析 又是一条模拟,用set+queue(这里手写了)处理即可.注意到两种局势"1 234"和&qu ...

  7. python接口测试(三)——Excell文件读取进行参数化

    python进行http请求时,需要对参数进行参数化,此时就可以运用Excel进行,具体如下: 1.梳理出请求中那些参数需要参数化,然后新建一个Excel,如图: 2.读取Excel中的内容,在读取前 ...

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

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

  9. 详说大数据计算的可类化Classable

    可类化(Classable)是Laxcus大数据管理系统提供的一项基础功能,它能够将类转化为一串字节数组,或者逆向将字节数组转化为一个类.这项功能与JAVA提供的序列化(Serializable)非常 ...

  10. Halcon和Opencv区别

    Halcon:机器视觉行业里知名的商业视觉库,非开源的,在国内市场份额处于第一,其提供了1500个多个API算子供开发人员使用,有些编程基础的都可以轻松的入门,其调试也是很方便的,断点单步运行,图像变 ...