博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1202F You Are Given Some Letters...
阅读量:4700 次
发布时间:2019-06-09

本文共 1124 字,大约阅读时间需要 3 分钟。

有一个很显然的\(O(a+b)\)的做法可以想到,就是枚举\(k\),然后\(O(1)\)判断

如何\(O(1)\)判断,我们显然考虑将这个序列每\(k\)个分一个块,只要判断存不存在合法方案就行了

其实这个时候很显然就能想到整除分块了,所以复杂度已经优化到\(O(\sqrt{a+b})\)

判断的方法为:

我们需要满足每个块都能放满,并且每个块中\(\rm A\)\(\rm B\)的数量相等

\(n\)为总长度,\(m\)为完整的块数,\(s_a\)为每个块中的\(A\)的数量,\(s_b\)为每个块中\(B\)的数量

\[ n=a+b,m=\lfloor\frac{n}{k}\rfloor\\ s_a+s_b=k\\ s_a*m<=a,s_b*m<=b\\ s_a<=\lfloor\frac{a}{m}\rfloor,s_b<=\lfloor\frac{b}{m}\rfloor\\ a-s_a*m<=s_a,b-s_b*m<=s_b\\ s_a>=\lceil\frac{a}{m+1}\rceil,s_b>=\lceil\frac{b}{m+1}\rceil\\ \]
\[ \lceil\frac{a}{m+1}\rceil<=s_a<=\lfloor\frac{a}{m}\rfloor\\\lceil\frac{b}{m+1}\rceil<=s_b<=\lfloor\frac{b}{m}\rfloor \]
然后计算有多少合法的\(k\)就好了

代码:

#include
#include
#include
using namespace std;#define rg registervoid read(int &x){ char ch;bool ok; for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1; for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;}const int maxn=1e5+10;int a,b,n,ans;int main(){ read(a),read(b);n=a+b; for(rg int i=1,j;i<=n;i=j+1){ j=n/(n/i);int t=n/i; if(a

转载于:https://www.cnblogs.com/lcxer/p/11401284.html

你可能感兴趣的文章
洛谷P2114 起床困难综合症【位运算】【贪心】
查看>>
Ubuntu+caffe训练cifar-10数据集
查看>>
net 把指定 URI 的资源下载到本地
查看>>
招投标专家库
查看>>
OJ-2:区间问题【九度1554】
查看>>
js中 $ 未定义 或者 “xxx”未定义
查看>>
Sublime3插件安装
查看>>
迅雷thunder://协议解密
查看>>
mybatis插入数据
查看>>
《高级软件测试》11月30日工作记录
查看>>
ios 联网 在mac机器上进行抓包
查看>>
Deformity ASP/ASPX Webshell、Webshell Hidden Learning
查看>>
linux运维、架构之路-rpm定制、本地yum仓库搭建
查看>>
Round 403 div. 2
查看>>
如何为一个高负荷站点配置tomcat连接器(connector)【译文】(第一篇)
查看>>
[转]大型网站系统架构的演化
查看>>
一个游戏程序员的学习资料
查看>>
非常好的JSUI
查看>>
基于EasyNVR摄像机无插件直播流媒体服务器实现类似于单点登录功能的免登录直播功能...
查看>>
python学习0day
查看>>