题意:一个字符串包含a个A和b个B,求这个字符串所有可能的循环节长度(末尾可能存在不完整的循环节)

好题,但思路不是很好想。

首先由于循环节长度可以任意取,而循环次数最多只有$O(\sqrt n)$个,因此考虑枚举循环次数(利用整除分块的思想),求a,b可能的循环长度。

那么问题转化成了:给定最大循环次数k和字符个数n,求循环长度l的取值范围,也就是使得$\left \lfloor \frac{n}{l}\right \rfloor=k$的l的取值范围。

首先确定l的上界,即$kl\leqslant n$,$l\leqslant \left \lfloor \frac{n}{k}\right \rfloor$,这个是显然的。

然后确定l的下界,如果$kl+l\leqslant n$的话,那么可以再分出去一个l,与最大循环次数为k矛盾,因此下界为$(k+1)l>n$,$l\geqslant\left \lfloor \frac{n}{k+1}\right \rfloor+1$。

综上,l的取值范围应为$[\left \lfloor \frac{n}{k+1}\right \rfloor+1,\left \lfloor \frac{n}{k}\right \rfloor]$。

然后貌似对于每个最大循环次数k,令n分别等于a,b,求出a和b的取值范围,进而确定a+b的取值范围就可以了。

但是这里有一个问题:a和b的k值不一定相等!比如说有10个a,9个b,每段有2个a和2个b,那么a和b的k值分别为5和4!(坑死人)

于是只能允许$kl+l=n$的情况存在了,也就是强行令$(k+1)l\geqslant n$,即$l\geqslant \left \lceil \frac{n}{k+1}\right \rceil=\left \lfloor \frac{n+k}{k+1}\right \rfloor$,这样就能应付上面的特殊情况了。

然而这样还没完,求出的取值范围可能有重复!怎样去重呢?最无脑的方法是把所有取值范围的区间排个序然后从左往右扫一遍,不过也可以限制一下l的取值范围,也就是强行令$l\in [\left \lfloor \frac{a+b}{k+1}\right \rfloor+1,\left \lfloor \frac{a+b}{k}\right \rfloor]$,这样就能避免重复了。

逻辑可能不是很清晰,如果还不明白的话可以去看官方题解

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+,inf=0x3f3f3f3f;
int a,b;
int main() {
scanf("%d%d",&a,&b);
int ans=;
for(int l=,r,k; l<=a+b; l=r+) {
k=(a+b)/l,r=(a+b)/k;
int L1=(a+k)/(k+),R1=a/k;
int L2=(b+k)/(k+),R2=b/k;
if(L1<=R1&&L2<=R2)ans+=min(R1+R2,r)-max(L1+L2,l)+;
}
printf("%d\n",ans);
return ;
}

CodeForces - 1202F You Are Given Some Letters... (整除分块)的更多相关文章

  1. CodeForces 1202F(数论,整除分块)

    题目 CodeForces 1213G 做法 假设有\(P\)个完整的循环块,假设此时答案为\(K\)(实际答案可能有多种),即每块完整块长度为\(K\),则\(P=\left \lfloor \fr ...

  2. 51Nod 1225 余数之和 [整除分块]

    1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ... ...

  3. [Bzoj 2956] 模积和 (整除分块)

    整除分块 一般形式:\(\sum_{i = 1}^n \lfloor \frac{n}{i} \rfloor * f(i)\). 需要一种高效求得函数 \(f(i)\) 的前缀和的方法,比如等差等比数 ...

  4. P2568 莫比乌斯反演+整除分块

    #include<bits/stdc++.h> #define LL long long using namespace std; ; bool vis[maxn]; int prime[ ...

  5. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

  6. [POI2007]ZAP-Queries (莫比乌斯反演+整除分块)

    [POI2007]ZAP-Queries \(solution:\) 唉,数论实在有点烂了,昨天还会的,今天就不会了,周末刚证明的,今天全忘了,还不如早点写好题解. 这题首先我们可以列出来答案就是: ...

  7. [笔记] 整除分块 & 异或性质

    整除分块 参考资料:整除分块_peng-ym OI生涯中的各种数论算法的证明 公式 求:\(\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\) 对于每个\(\lfloo ...

  8. 洛谷P3935 Calculating(整除分块)

    题目链接:洛谷 题目大意:定义 $f(x)=\prod^n_{i=1}(k_i+1)$,其中 $x$ 分解质因数结果为 $x=\prod^n_{i=1}{p_i}^{k_i}$.求 $\sum^r_{ ...

  9. 整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)

    上模板题例题: [CQOI2007]余数求和 洛谷 BZOJ 题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值. 等等……这题就学了三天C++的都会吧? $1\leq n,k\leq ...

随机推荐

  1. PHP根据IP判断地区名信息的示例代码

    <?php header("Content-type: text/html; charset=utf-8"); function getIP(){ if (isset($_S ...

  2. 【log4j】的学习和理解 + 打印所有 SQL

    log4j 1.2 学习和理解 + 打印所有 SQL 一.基本资料 官方文档:http://logging.apache.org/log4j/1.2/manual.html(理解基本概念和其他) lo ...

  3. BootStrap Table方法使用小结

    参考链接:https://www.cnblogs.com/Amaris-Lin/p/7797920.html

  4. GxDlms编译

    目录 GxDlms编译 title: GxDlms编译 date: 2019/12/5 13:36:37 toc: true --- GxDlms编译 C++版本如果要编译动态库,项目>属性需要 ...

  5. vimium快捷键修改

    vimium是一款很好用的浏览器插件,可以用键盘来进行一些操作. 需要在浏览器的扩展程序商店里下载相应的插件,然后可以右键点击插件打开选项进行个性化的配置. map+字母+功能描述 功能描述从opti ...

  6. poj3107(树的重心,树形dp)

    题目链接:https://vjudge.net/problem/POJ-3107 题意:求树的可能的重心,升序输出. 思路:因为学树形dp之前学过点分治了,而点分治的前提是求树的重心,所以这题就简单水 ...

  7. lua添加自定义模块的步骤

    以下方法在lua 5.2.4版本下成功实现: 1. lua.c为所有函数的主程序,参考Makefile的编译链接2. lua.c中int main (int argc, char **argv) { ...

  8. rownum伪行号-排行榜-分页

    rownum伪行号-排行榜-分页 1.rownum 是oracle数据库特有的一个特性,它针对每一个查询(包括子查询),都会生成一个rownum用于对该次查询进行编号 2.每个rownum只针对当前s ...

  9. 解决Eclipse中文文档注释错位-处女座的悲哀!

    1.右键打开eclips属性 2.选择兼容性为win8,然后打开Eclipse即可解决 作者:醉烟 出处:https://www.cnblogs.com/WangLei2018/    本文版权归作者 ...

  10. 【51nod】2606 Secondary Substring

    51nod 2606 Secondary Substring 感觉有趣的一道计数,实际上不难 感觉好久没用这种技巧了,导致我还在错误的道路上想了好久... 观察题目性质,可以发现就是左边第一次出现两遍 ...