CF2039

传送门

A:取 ai=2i1 即可。

B:注意到如果有连续三个相邻不同字符,这个长度为 3 的子串满足;如果有相邻两个字符相同,这个长度为 2 的子串满足。否则字符串形如 ababab,没有子串满足。

C1:数学太拉了

题意:给定正整数 x,m,计数 y[1,m]xyx,y 中有至少一个是 xy 的倍数。(x106,m1018

分析:

因为 x,y>0,所以 xy<x,y,所以 xy 必定是真因数。

而一个数的真因数 它的 12,所以要使得 ab 的真因数,a[b2],所以 a 至少二进制比 b 少一位。

而当 y2x 时,xyy 的二进制位数相等,所以 xy 不是 y 的因子;而且此时它比 x 大,也不可能是 x 的因子。

所以:合法的 y 总是 <2x

因此枚举 i=12x1 检验即可。

C2:数学太拉了

题意:给定正整数 x,m,计数 y[1,m]xyx,y 中有至少一个是 xy因数。(x106,m1018

分类讨论。依次考虑 xyx,yx,y 的因数。

  1. xxy 的因数。p=xy,问题转化为求有多少个 p 使得 xp 的因数且 1pxm

    异或性质:pxp+x 所以当 pmx 时,1pxm 总是满足,只需要保证 xp 的因数即可。这等价于问 x1mx 里有多少个它的倍数,答案是 [mxx]

    那对于 p>mx 的呢?再异或性质:pxpx,所以当 p>m+x 时,pxm 总是不满足

    因此这种情况剩下可能合法的 p 只存在于 (mx,m+x] 里,暴力枚举检验。

  2. yxy 的因数。因为有了上面的观察:xyx+y这限制了异或的范围),所以当 x<y 时,x+yx+y<2y,这时候 y 要是 xy 的因数只能 x=0,无解。

    所以剩下的情况只有 x>y 的情况,因此枚举 y=1x 检验即可。

  3. x,y 都是 xy 的因数。

    转化:lcm(x,y)xy 因数。

    xyx+y,而 lcm(x,y)xy2max(x,y),所以当 xy 时不可能合法。

    检验 y=x 即可。

D:

题意:给定数集 S,要求构造一个(或判定无解)字典序最大的 n 长度序列 {ai},使得 aiSagcd(i,j)gcd(ai,aj)。(n,|S|105,ain

agcd(i,j)gcd(ai,aj) 的条件很迷惑。取 ij 的因数,就得出结论:对于任意 ij,不能有 aiaj

那么这个条件是否是充分的?假设 ag=gcd(ai,aj),其中 g=gcd(i,j),则 agai,与 aiaj 矛盾。所以是充分条件。

法一:贪心法。枚举 i=1n,每次都选与前面不干扰的最大数。(赛时想到了,然而没想到上面的结论所以是假复杂度)

实现方法:枚举位置 i 的因数 j(均摊 O(nlogn))。然后给数 aj 打上标记,再从大到小枚举找第一个打标记的即可。

法二:考虑 iki 建立一个 DAG,那么位置 i 能填的数的大小仅与在 DAG 上以 i 开头的最长链长度有关,可以用 DP 求出;因为边的总数是 O(nlogn) 的。

如果你仔细分析,发现这个值等于 i 的各质因数次数之和 +1

E:巧妙 DP 题。

题意:给定初始序列 a={0,1}。每次可以将 "当前序列的逆序对数" 插入序列的任意位置,问有多少种可能的 n 长度序列。n106

来自 Byf 的观察:记 fi=ifi11,答案为 i=1nfi

解法:

注意到当逆序对数大于序列内任何一个数之后,如果不将它插在末尾,新的逆序对数仍然大于序列内任何一个数。

dp[i] 表示当前序列为 i 长度且逆序对数大于序列内任何一个数,能构造出多少种 n 长度的序列。

如果不插入到末尾,dp[i]dp[i+1];否则枚举插入 j 个到末尾,然后随便插入一个在前 i 个里面(i 种方式),dp[i]idp[i+j+1]。注意可以直接在末尾插到 n 长度。

在求出 dp[i] 后,我们的问题变成第一次逆序对大于序列内任何数的位置在哪里。初始序列是 {0,1},也就是只要出现逆序对 2 就可以了。

初始逆序对数为 0。逆序对数将一直为 0 直到第一次插入 0 至末尾,此时逆序对数为 1
然后为了保持逆序对不达到 21 只能一直插入在末尾的那一块。

所以,逆序对 1 的序列必然形如 0,0,0,,0,0,1,0,1,1,1,

如果最终逆序对数都 1,有 n1 种可能:0 的个数 1n1

回到问题,我们要枚举 m,然后计数长度为 m 的第一次逆序对数 =2 的序列种数。因为逆序对数 1 的必然形如上面的形式,因此长度为 m 的第一次逆序对数 =2 的序列,在长度 m1 时就是上面的形式,因此只需决策第 m 次的 1 插入哪里。如果中间那个 1 位于 aj,则有 j1 种方案插入。因此对于序列 m 的方案数就是 j=2m1(j1)=(m2)(m1)21

总方案数即为 n1+m=3n((m2)(m1)21)dp[m]

posted @   FLY_lai  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示