The final
The end
T1
构造题 n/k为偶数很好构造,每组直接前面拿n/k/2个,后面拿n/k/2个
n/k为奇数需要想一想,首先可以把1~n分成n/k段,每段选一个放到一组里,按照以上方法处理n/k-3段,使每组各数之和相等。再来看前三段,可以把第三段提出来,用前1,2段构造一个等差数列。如何构造?只需要找到需要的等差数列的第一个数,以及第一段的第一个数,第二段的数就是等差数列的数-第一段的数。然后选第一段的下一个数,并且第二段也应该选下一个数,所以等差数列的数+=2。如果目前等差数列的数以及超了我需要的,那就减小到我需要的数的最小值。
无解有两个部分,首先要判断n!=k,其次看1到n的和是不是k的倍数,缺一不可
T2
第一问很轻松,线段树随便搞
第二问有点ex,先可以想到暴力枚举每一段区间求gcd,时间复杂度n*n,A不了
考虑用map优化,ans[gcd]存每个gcd的数量,p[i][gcd]存以第i个数结尾的gcd的数量,然后从p[i-1]的状态转移,ans[gcd]+=p[i][gcd]。
T3
时间复杂度n*n*a的方法很好想,开三维就好了,但是肯定A不了,最多开两维,但是这道题限制比较多,只有两维又不够
经过一番分析,可以得到答案只和suma和sumb有关。
所以我们可以存多个答案,vector<pair> f[i][j]表示到第(i,j)的所有有效suma和sumb。
我们不能确定suma和sumb谁更大更好,所以我们都存下来,但是我们知道,如果一种方案的suma和sumb都比另一种大,那肯定是更好的
然后转移的时候,正常是把(i-1,j)和(i,j-1)的状态全部添加给(i,j),但是有无用的状态,所有我们使用归并排序·,维护一个suma递增,sumb递减的数列,如果某一项不满足,就直接舍那一项。
T4
概率dp