有 n 个同学,m 个科目。每个科目计划在 bi 天公布成绩,第 i 位同学希望在第 ti 天及以前知道所有科目的成绩,假如最晚的一个科目公布时间为 t ,则其不满意度为 max(0,t−ti)×C。现有两种操作,一是将科目 X 的公布时间推迟一天同时将 Y 的公布时间提前一天,一次操作不满意度为 A ;二是使科目 X 的公布时间提前一天,一次操作不满意度为 B 。(其中 X,Y 为任意科目)。求最小的不满意度之和。
所以我们反复使用扩展欧拉定理,每次都会把 m 变为 φ(m) ,当 φ(m)=1 时,原式变为定值。所以我们不断将 p 变为 φ(p) 直到为 1 后停止,而一个数最多经过 log 次就可以变成 1 ,因为偶数的欧拉函数值必定小于它的一半,而奇数的欧拉函数值必定为偶数,所以我们只需要维护 logp 个幂即可。同时,发现此题涉及到区间操作,考虑用线段树直接维护区间和以及区间最小变换次数即可。这题预处理比较麻烦,我们需要预处理出 ai,j 表示 cc⋯ai (其中下方 c 的个数为 j ),这个直接套用扩展欧拉定理即可,若直接套用快速幂计算,预处理复杂度为 O(nlog3p) ,所以我们替换为光速幂。设定阈值 b ,预处理所有的 px=cx 和 qx=cbx ,则 cx=pxmodb⋅q⌊xb⌋ ,这样省去了快速幂的复杂度。最终总时间复杂度为 O(nlog2p+nlognlogp) 。
T3 组合数问题
给定正整数 n,p,k,r ,求 (∑∞i=0Cik+rnk)modp 的值。
1≤n≤1090≤r<k≤502≤p≤230−1
可以转变题意,即求在 nk 个物品中选出 x 个,且满足 xmodk=r 的方案数。那我们有一个比较显然的 dp ,设 fi,j 表示当前考虑第 i 个物品,选出的数量 modk=j 的方案数,转移也比较简单。分别考虑是否选这个物品,就有 fi,j=fi−1,j+fi−1,(j−1+k)modk ,时间复杂度为 O(nk2) 。我们发现 n 非常大,而且 fi 的转移只和 fi−1 有关系,我们可以考虑用矩阵乘法优化转移。
给定一棵 n 个点的树,找到树上的两条边不相交的路径,使得删去路径上的所有点和边后剩下的连通块数量最多,输出最大个数。
n≤5×105
大力树形 dp ,我们设 fu,0/1/2/3 表示以 u 为根的子树(包括u )的四种情况。具体地,fu,0 表示链的一个端点为 u ,另一个端点在 u 的子树内,fu,1 表示路径的两个端点在 u 的子树内且路径不经过 u ,fu,2 表示路径的两个端点在 u 的子树内且路径经过 u ,fu,3 表示一条链以 u 为端点,另一个端点在子树内,以及一条路径两端在 u 的子树内且允许经过 u 。
考虑如何转移,以下设 v 为 u 的直接儿子,sonu 表示 u 的儿子数量。
fu,0=max(fu,0,fv,0+sonu−1) ,即连接 u 到 v 的边。
fu,1=max(fu,1,fv,1,fv,2+1) ,直接继承 v 的两种情况。
fu,2=max(fu,2,fu,0+fv,0−1) ,将两条链直接拼起来,注意 fu,0 多算上了 v 为根的连通块,而连接上 v 后就没了,所以要减一。
以下 fu,3 的转移省略 max 符号。
fu,3=fu,0+fv,2−1 直接作为两条路径,fu,0 多统计了 v 的连通块,所以减一。
fu,3=fu,0+fv,1−1 和上面的类似。
fu,3=fu,2+fv,0−1 将 v 到 u 的路径连接起来,减掉 v 的那一个连通块。
fu,3=fv,3+sonu−1 将 v 到 u 的路径连接起来,多了 sonu−1 个连通块。
设 tmp 为之前的儿子中 fv,1 和 fv,2 的最大值,fu,3=fv,0+son[u]−1+tmp−1 。直接根据 fu,3 的意义转移,将 u 和 v 连接,减去 tmp 和 v 的那两个连通块。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探