随缘更新codeforces题解
gym 103260 L. Extreme Wealth
不妨设两个数分别是a,b,n=a+b
首先答案是\(2^{n}/(C_n^a)\)
这个结论可以通过DP后打表找出来
当然也可以证明:
结论1:可以压两边达到相同的效果
不妨设左右各压了c,c+d,原本有X=2c+d
那么两种情况分别会剩下2c,2c+2d
这和我对右边压d会达到同样的效果,因为最后也是得到2c,2c+2d
结论二,钱一定可以压完
不妨设我剩下x块钱没有压出去
那么我左边压x/2,右边压x/2,也是同样的效果
所以我们现在知道了,每一轮,我们都会把钱全部花光在两边
即我们现在有一颗决策二叉树,到达每个叶子的概率是相同的,我们把钱全部压倒叶子里,然后最后答案就是最小的叶子*\(2^n\)
这里显然采取均分的方法,所以答案就是\(2^{n}/(C_n^a)\)
第二个问题来了,怎么计算答案
考虑当n较小的时候用python暴力算,当n较大的时候套用斯特林公式
\(n!=\sqrt{2\pi n}(\frac{n}{e})^n\)
整一个过程可以取ln算
就可以在误差范围内通过此题了
1656 H. Equal LCM Subsets
先考虑一个check两个集合lcm是否相等的样子
对于A集合中的每个元素a,去计算
\(d=gcd(a/gcd(a,b_i))\)
考虑\(a/gcd(a,b_i)\)的意义,其实就是\(a\)和\(b_i\)中指数\(a\)比较大的部分
如果\(d>1\),那么可以确定两个lcm一定不相等
因为\(a\)已经存在某一个因子的次方比\(b\)里面所有都大
若\(d=1\),则可以推出\(a|lcm(B)\)
对\(B\)同理,假设此时所有\(d\)都为\(1\),那么可以得到两个集合的\(lcm\)相等
至此,做法已经出来了,如果存在一个\(d>1\),就把这个元素删掉
然后不断重复这个过程就可以了
至于如何快速询问\(d\),可以用\(n\)棵线段树来维护
gym102538 300iq Contest 3 C.Cells Blocking
跑出一条尽可能往左的路和一条尽可能往右的路,分别即为\(A\),\(B\)
考虑如果只能堵一个点怎么做
两条路径的交集就是答案了
同理,如果我们堵了一个交集,那么我们选任何一个其他点都是答案
否则,我们去枚举\(A\)上的每一个点,堵上这个点,然后搜索另外的一条路径尽可能往左的路径C,此时CB的交集就是答案了
一开始我们预处理出每个点是否可以从起点到达且能到达终点
就可以\(O(路径长度)\)搜出来一条路径
故复杂度是\(O(n^2)\)
性质有只往下或右走有一个性质,就是第\(i\)步的位置一定在\(x+y=i\)的点上
然后这种图的支配点是可以爆搜一下跑出来的
gym102538 300iq Contest 3 E Easy Win
答案等价于询问\((a_{1}modx) ⊕{a_2modx}⊕....⊕ {a_nmodx}\)
对于异或问题,常常考虑拆位来做
对于取模问题,常常考虑枚举倍数
对于一个\(x\),去枚举其倍数,不妨设其倍数为\(y\)
那么对于在\([y,y+x)\)中的所有数\(z\),其余数都是\(z-y\)
换句话说,我们要快速求出\(z-y\)的异或和
带减法依然是不好做的,考虑一位一位考虑,现在处理\(2^i\)
定义一个辅助数组\(f_{j,i}\)表示有多少个数\(x\)满足\(x\ge j\)且\((x-j)\)在\(i\)这一位为\(1\)
有一个性质就是假如\(x\)在第\(i\)位为1,那么\(x-2^{i+1}\)在第\(i\)位也同样为1
可以递推的\(f_{j,i}=f_{j+2^{i+1}}+cnt[j+2^ij+2^{i+1}-1]\)
\(cnt[l,r]\)的定义为,这个区间里有多少个数
这个\(f\)满足一个性质,就是虽然减的数不同,但是假如两个数的差值是\(2^{i+1}\),那么依然是可以差分的
这时候再去考虑我们的询问\([y,y+x)\)
找到一个最大的位置\(k\in[y,y+x)\),让他与\(y\)关于\(2^{i+1}\)同余
差分得出\([y,k]\)的答案,然后对于\([k,y+x)\),因为区间的长度不超过\(2^{i+1}\),所以变化点只有一个,直接去询问\(cnt[k+2^{i},min(k+2^{i+1}-1,y+x)]\)即可
复杂度\(O(nlog^2n)\)
1615 H
最优化问题常见方法,构造一个下界,尝试构造一个方案达到下界
构造下界
我们定义\((u,v)\)为所有\(u\)可以到\(v\)的点对,直接相邻或者间接相邻都可以
假设存在有一个点对\((u,v)\),那么答案至少为\(a_u-a_v\)
更一般的,如果对于k个点对\((u_i,v_i)\),满足一个数字在集合\((U∪V)\)中只出现了一次
那么答案至少为\(\sum a_{u_i}-a_{v_i}\)
找到这个最大的和即为下界
这个过程很简单,对于原图的\((u,v)\),建立\((inf,a_u-a_v)\)的边
然后对于每一个点\(u\),\(S\)与\(u\)和\(u\)与\(T\)建立\((1,0)\)的边,跑最大费用流即可
最后,如果\(u\)同时与S和T的边都满流了,把他设定为不满流,显然这样不会影响费用
这样处理之后,每一个点要么和\(S\)满流,要么和\(T\)满流,即至多出现一次
构造方案
在残留网络中,即如果还有流量就保留,包括反向边,对S跑出到所有节点的最长路\(d_u\)
我们令\(b_u=a_u+d_u\)为答案
对于原来的一个限制点对\((u,v)\),因为原本的边流量为inf,故必存在与残留网络中,即有\(d_u+(a_u-a_v)\le d_v\),即\(b_u=d_u+a_u\le d_v+a_v=b_v\),符合条件
但同时,对于我们选中的点对\((u,v)\),反向边有流量,同理可得\(b_v\le b_u\)。
同时,因为\(u\)在残留网络中与\(t\)连通,故必不可能有\(d_u>0\),否则找到一条增广路
同理有\(d_v\)不可能小于\(0\)
故得到\(a_v\le b_v=b_u\le a_u\)
不难发现,对于一个选中的点对,调整力度恰好就是\(a_u-a_v\)
对于一个没有选中的点,有\(d_u=0\),证明同上
故恰好与所需的下界相同
1622 F
不妨令\(f(x)\)为消完因子之后的答案,即消完平方因子之后的数
显然有\(f(xy)=f(f(x)f(y))\)
\(f(n!(n+1)!)=f(n+1)\)
对于偶数\(2k\),\(f(1!2!3!...(2k)!)=f(2*4*8*...*2k)=f(2^k*k!)\)
若\(k\)为偶数,则只去掉\(k\)就可以是一个合法方案
若k为奇数,去掉\(k\)和\(2\)就是一个合法的方案
故对于偶数,只需要删掉不超过2个数
奇数因为通过删掉\(n\)就可以变为偶数,故答案不超过\(3\)
故对于所有的数删掉的数不超过\(3\)个
- 判断平方数的一个小trick
对于所有质数随机一个大数\(p(x)\),然后\(p(xy)=p(x) \ xor\ p(y)\)
一个数为平方数,显然有\(p(x)=0\)
故得到做法,先判一下全选,然后尝试删掉一个,然后尝试删掉两个,最后尝试三个,一定能找到一组解