打的重现塞,比赛时第一个就看这题,看完后一脸懵逼,觉得除了暴力贪心枚举以外想不到其他解法了。而且这样贪心还肯定是错的= =。
n个数给每个数都找一个位子,使得满足条件。事实上这就是一个匹配问题,自己做的题太少了,所以没感觉。
n和s最大可以取到1e9。这么大的数据怎么办呢?答案就是要么先找找规律取取巧,把问题化简,要么就换思路。
这题就是把区间[1+s,n+s]的数放到区间[1,n]中。
设x为区间[1+s,n+s]中的数,y为区间[1,n]中的数。
要让所有的x满足x%y==0。
先考虑两个区间相交的情况。
那么相交部分就直接放到对应编号的位子上就好了,因为x都是最小的那些,y都是最大的那些。
试着证明一下。
关键是怕抢了不该抢的位子是不。
如果x只能放在这里,那就不算抢。
否则设x还可以放在Y,Y<y,x%Y==0。
对于某个X>x,若可以放在y,则X%y==0,因为y==x,且x%Y==0,推出X%Y==0,所以X也一定能放在Y,所以也没有抢。
那剩下的怎么办呢,或者说终究得考虑区间不相交的情况。
因为素数只能放在1号或自己编号的位子,所以若区间[s+1,n+s]中若有2个以上的素数,那就至少有一个素数没地方放,那就绝对不行。我们知道两个素数之间的间隔是很小的(相对于素数的大小而言)
http://www.guokr.com/post/474460/
printf("%d\n",int(log(n)*(log(n)-2*log(log(n)))+2));
因此如果区间太大,那就直接输出No就好了。
只有区间足