cf283d

来源:互联网 发布:最优化算法pdf 编辑:程序博客网 时间:2024/06/05 19:28

此题证明花费时间够长。。。特意写这个来述说我痛苦的证明过程。。。。

此题要在比赛的时候证明出全部的性质还是比较难的。。。(自己太菜了。。。)

首先对于y个连续数的和可以这样表示:x=t+(t+1)+(t+2)+...+(t+y-1) 那么总和就是:x=y*(y-1)/2+y*t===>x=y*((y-1)/2+t)=====>2*x=y((y-1)+2*t)

然后讨论奇偶情况:y为奇数时,只要x被y整除就一定可行....y为偶数的时候就要看其因子了。

我们对于一个数要讨论奇偶可以这么设:B为2的幂次,L为剩余的因子那么一个数就可以表示成 x=2^B * L

然后讨论相邻的两个数:Y是奇数 可行的条件是:X.L % Y.L==0...............Y是偶数 可行的条件是:X.L%Y.L==0 && X.B+1==Y.B因为多乘了一个2

然后我们要设计dp了 对于dp【i】表示从第i个数之前串已经是cool的了,且第i个数字不变需要的最少变化次数。

那么对于dp【j】转到dp【i】就相当于将中间的数全都变成可行解变的个数是i-j-1(-1是由于最后一个不能变),那么对于dp转移就是dp【i】=min(dp【i】,dp【j】+i-j-1)

然后我们要对于j是否可以转就要判断了。

通过上述的相邻数的表示,然后来推j到i的表示

根据前面推的,那么只要X.L % Y.L!=0  肯定不是可行解。 然后判断后面的

如果是奇数 其实就满足了条件了 直接可以转移了即X.B==0

如果是偶数,那么按照前面推的X.B+1==Y.B    X+1.B+1==X.B  ...那么一直到j然后化简得到==》j.B=i.B+j-i 

还有一种情况是没有想到的i.B<i-j ,由于已经保证了L是倍数关系了,你可以每次都给y这个数除以2,一直到它没有约数2的时候,这时x一定是y的倍数,并且y是奇数了。比如x=10,约数2有1个,y=20,并且假设他们下表差很大,那么我给y除2得10,再除2得5,这时还没有到x,并且5是个奇数了,然后全是5,结果就是10,5,5,5,5,5,,,,,,5,5,10,20.

http://blog.csdn.net/bjtulxc/article/details/8784468#comments

在最后处理数组的时候在原串后加一个1,表示最后一个数由其自己表示


如果我的思路是错的望大神指正!感激不敬。。。。。