T1
题目大意
给定三个整数(a,b,c),求有多少个多项式(F(x))满足(F(a)=b,F(b)=c),多项式的系数都为非负整数,如果有无穷多个,输出(-1)。
sol
考场上我只写出了dfs的暴力。其实多项式的每一项系数都小于等于b,先特判掉等于b的情况,然后就可以把c看成b进制数(特判b等于1),算出多项式的系数,检验(F(a))是否等于b。
T2
题目大意
设(f_n)为斐波那契数列的第(n)项,求$$gcd(af_n+bf_{n+1},cf_n+df_{n+1})$,其中(1<=a,b,c,d<=10^3,1<=n<=10^{18})。
sol
我在考场上只写了暴力和(b=d=0)的部分分,我开始还以为正解是很高级的数据结构,结果是很巧妙地利用了更相减损术,(c*f_n+d*f_{n+1})减(lfloorfrac{c}{a} floor)次(a*f_n+b*f_{n+1}),得到(c\%a*f_n+(d-b*lfloorfrac{c}{a} floor)f_{n+1}),通过这种方法化简原式,可以得到(gcd(a*f_n+b*f_{n+1},c*f_{n+1}))的形式。可以先求出(gcd(a*f_n+b*f_{n+1},f_{n+1})),这个等于(gcd(a,f_{n+1})=gcd(a,f_{n+1}\%a)),可以用矩阵快速幂求出,设(g=gcd(a,f_{n+1})),则原式等于(g*gcd((a*f_n+b*f_{n+1})/g,c*f_{n+1}/g)),根据gcd的定义,这等于(gcd(a*f_n+b*f_{n+1},c*g)=gcd((a*f_n+b*f_{n+1})\%(g*c),g*c)),再次运用矩阵快速幂求出结果。
T3
题目大意
风和日丽的一天,小L和小G在玩游戏,游戏是在一个带权图(G=(V,E))上进行的,其中总点数(n)是偶数,点有点权(w(v)),边有边权(c(e))。游戏的规则是这样的:
- 小L和小G轮流给图中的点染色,小L会把顶点染成黑色,小G会把顶点染成白色
- 每人每轮必须给恰好一个点染色
- 两个人都不能对⼀个已经染过色的点染色
- 在(frac{n}{2})轮游戏之后,每人都有一个包含了所有被他染色的点的集合。对于顶点集合(S),得到的分数是点权和加上导出子图(即这些点和两个端点都在点集内的所有边构成的子图)的边权和。
本着女士优先的绅士风度,小L请小G先染色。两⼈都想要使自己的分数比对方多,且越多越好。小L和小G都非常聪明,一定会用最优策略进行游戏。显然最后两人的分数是唯一确定的,求最终小G的分数减去小L分数。
sol
这题不是零分就是满分很显然我是零分。我开始想了一个错误的贪心。图有点权有边权很烦,我就把每个点给定一个值,为点权与和它相连的边权和。每次每人选值最大的点。结果一分都没有。
正解是正确的贪心。设(f)为小G的分数减小L的分数,对于每条边,讨论它两端的颜色,如果都是白色,相当于每个白点对(f)贡献了(frac{1}{2}),如果都是黑色,相当于每个黑点对(f)贡献了(-frac{1}{2}),如果一黑一白,相当于黑点对(f)贡献了(-frac{1}{2})、白点对(f)贡献了(frac{1}{2})。所以依然可以给每个点一个优先值,为点权与和它相连的边权的(hugefrac{1}{2})的和。每次每人选值最大的点,(f)为小G选出的点的优先值减小L选出的点的优先值。时间复杂度(Theta(nlogn))(排序)。