上海就是神仙打架
D - Strange Fractions
给出整数p和q,找到两个正整数满足qp=ba+ab
数学
使用换元法,令y=qp,x=ba
则原式等于y=x+x1
即 x2−xy+1=0
题目中已经给了 y,我们只需要找到其中一个 x即可。
当 Δ=y2−4<0时,输出 Impossible
在计算过程中全程使用分数。
E - Strange Integers
给 n 个整数 A1,A2,⋯,An和整数 k,从中任选一些数字,要求任选的两个数字的差的绝对值大于 k,输出最大可选择的数字数量
签到
贪心
G - Edge Group
一个有 n 个顶点 n−1条边的无向连通图,n是奇数。将其n−1条边分为2n−1组,满足下列约束条件
输出分组方案模 998244353
树形dp
组合数学
首先考虑 n 个边两两分组的情况。
- 如果 n 是奇数,多出来的1条边肯定要和父节点上的边进行配对,也就是n−1条边相互配对,剩下一条和父节点的配对。
- 如果 n 是偶数,那么这些边就要两两相互配对
当 n 为偶数的时候我们需要考虑两两分组有几种情况。
考虑n=2有1种分法,n=4时,新加的两个边中的一条边必须和之前的两个边之一配对,要么和另一个新加的边配对,一个有 (2+1)×f(1) 种分法。推广到 f(n)=(n−1)×f(n−2)。即 f(n)=(n−1)!!
那么现在就可以得出转移方程:设 k 为子树中奇儿子的数量。
dp[i]=⎩⎨⎧(k−1)!!⋅∏dp[son]k!!⋅∏dp[son]
I - Steadily Growing Steam
有 n 张牌,每张牌具有一个点数ti和一个价值vi共两个属性。选择 ≤k 张牌,将其点数扩大一倍,然后将这 n 种牌分为两部分,要求两部分的点数和相等,求最大的价值和。
背包DP
先不考虑 k 次扩大,只考虑 n 张牌分为两部分。
可以用 dp[i][j] 表示考虑前 i 个物品时,∑ti = j时所取的∑vi
考虑 k 次扩大之后可以用 dp[i][j][k] 表示考虑前 i 个物品时,执行了k次扩大操作后,∑ti=j时所取的 ∑vi 值
不是很明显
dp[i][j][k]=⎩⎨⎧dp[i−1][j][k]不选择第i个物品dp[i−1][j−ti][k]选择第i个物品,不翻倍dp[i−1][j+ti][k]选择第i个物品,不翻倍,放到另一堆(即约为选择负的)dp[i−1][j−ti×2][k−1]选择第i个物品,翻倍dp[i−1][j+ti×2][k−1]选择第i个物品,翻倍,放到另一堆(即约为选择负的)
额外处理一下 j 维的负数问题即可。