2019暑假杭二day4测试总结

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(a*f_n+b*f_{n+1},c*f_n+d*f_{n+1})\),其中\(1<=a,b,c,d<=10^3,1<=n<=10^{18}\)

sol

我在考场上只写了暴力和\(b=d=0\)的部分分,我开始还以为正解是很高级的数据结构,结果是很巧妙地利用了更相减损术,\(c*f_n+d*f_{n+1}\)\(\lfloor\frac{c}{a}\rfloor\)\(a*f_n+b*f_{n+1}\),得到\(c\%a*f_n+(d-b*\lfloor\frac{c}{a}\rfloor)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}\)。所以依然可以给每个点一个优先值,为点权与和它相连的边权的\(\huge\frac{1}{2}\)的和。每次每人选值最大的点,\(f\)为小G选出的点的优先值减小L选出的点的优先值。时间复杂度\(\Theta(nlogn)\)(排序)。

猜你喜欢

转载自www.cnblogs.com/hht2005/p/11402665.html