C
核心思路
一定要看清楚题目,题目是要我们最小哦。
首先看可不可抽像为数学表达式,答案肯定是可以的。
x=p1^d1*p2^d2*..*pn^dn;
D=\sum{(d1+1)*(d2+1)*(d3+1)*...(*(dn+1))};
这个D表示的x的约数的个数,这个公式还是很好理解的,需要牢记。
ans=D-n-1;
为什么需要减一呢,因为需要排除约数是1的情况。
这个ans表示的是符合要求的强复合数。
然后我们可以根据不等式放缩可以得到D>=2^n.
所以总的就是2^n-n-1>=0
解得n>=3.
所以只要n大于等于3就肯定会存在强复合数。
接下来就只需要讨论n=1,2的情况了:
- n=1的时候肯定是不会成立的,因为只有一个质数。
- n=2这个时候发现只有\(p_i^2\)的时候是会成立的。
而题目是要我们分的组最小,所以我们刚开始直接22分组,然后就是33分组就肯定是最优的。
D
核心思路
这个题目属于是回文字符串的构造好题,首先我们需要去想怎么样可以构造出来p=n的答案,我们发现这样子的字符串是符合要求的:aaaaa...。然后想p=3怎么构造(注意这是在长度为n的要求下):其实就是abcabcabc....。我们发现这样子构造出来肯定就是3.
所以我们把最大值和最小值的情况分析出来了,这个题目就简单了。
一定注意观察k的取值范围,这个有很大的用处。
整个构造方法就是拿一段连续的相同的字母凑齐我们需要的贡献,再就是拿abc来补全凑足了贡献之后剩余的长度。
因为我们的k是最多是20,这就给了我们很大的好处。因为这就意味着我们凑贡献每次都可以使用不同的字母就好了。
举一个例子。
aaaabcabc
我们就是拿a来凑足贡献,剩下的就是来补长度的。
aaabcdddbc.
这也是一样的。
但是需要注意的就是我们刚开始处理的时候虽然bc接在a的后面时使用来凑长度的,但是这也有一个很重要的地方那就是当bc第一次出现的时候也会带来2的贡献。所以我们在处理第一段的时候还是需要注意下的。
标签:868,需要,题目,Codeforces,贡献,长度,Div,我们,就是 From: https://www.cnblogs.com/xyh-hnust666/p/17366895.html