CF1499
氵
如果 11
后出现了 00
就不行。
枚举走几段。
横竖可以分开算。
一定是:除了费用最小的都是走长度 \(1\),费用最小的包揽剩下的。
\(c\cdot lcm(a,b)-d\cdot gcd(a,b)=x\)
\(c\cdot \dfrac{a}{gcd(a,b)}\cdot \dfrac{b}{gcd(a,b)}=\dfrac{x}{gcd(a,b)}+d\)
\(gcd(a,b)\) 一定为 \(x\) 的因数,枚举 \(x\) 的因数。
把 \(\dfrac{\dfrac{x}{gcd(a,b)}+d}{c}\) 分解成两个互质的数的方案数累加进答案里去。
而分解成两个互质的数,就是对每一个质因子都选择去两边中的一边,有 \(2^{cnt}\) 中,\(cnt\) 是质因子个数。
而这个 \(2^{cnt}\) 可以用筛法的方式预处理。
给出俩字符串 \(a,b\),\(x\) 是 \(a\) 的子串,\(y\) 是 \(b\) 的子串;
\(x,y\) 可以用类似归并排序的方法把 \(x,y\) 的字符排到一个字符串里,使得 \(x,y\) 各自的字符相对顺序不变。
求和:对于所有 \((x,y)\) 的所有归并方法排得的字符串,有多少个相邻字符不同的字符串?(不同 \((x,y)\) 得相同结果只算一次)
定义 \(dp[i][j]\) 为对 \(a[1\sim i],b[1\sim j]\) 的后缀组合的求和。
意思就是 \(a[1\sim i]\) 的所有后缀和 \(b[1\sim j]\) 的所有后缀组合起来的答案的和。
最终输出 \(\sum\sum dp[i][j]\).
发现还不够,升一维:\(dp[i][j][0]\) 是在归并中以 \(a[i]\) 结尾的,\(dp[i][j][1]\) 是以 \(b[j]\) 结尾的。
若 \(a[i]\ne a[i - 1],dp[i][j][0]+=dp[i-1][j][0]\),但这种情况要注意:可能我们 \(a\) 的后缀选的是 \(a[i\sim i]\),所以我们要加上这种只选了 \(a[i]\) 的情况。
这种情况又分两种:① 如果 \(a[i]=b[j]\),这种情况不存在,因为 \(a[i]\) 接不了;② 否则就是查询 \(b[1\sim j]\) 中有多少个后缀相邻的不相等,这个也可以预处理。
若 \(a[i]\ne a[i - 1],dp[i][j][0]+=dp[i-1][j][1]\).
\(dp[][][1]\) 的计算同理:
若 \(b[j] \ne a[i],dp[i][j][1]+=dp[i][j-1][0],dp[i][j][1]+=a[1\sim i]\) 有多少个后缀相邻不相等。
若 \(b[j]\ne b[j - 1],dp[i][j][1]+=dp[i][j-1][1]\)
有多少种方式删掉一些边,使得树分成的连通分支的直径都 \(\le k\)?