这是本文档旧的修订版!
题解:考虑抽象,简化过程。
1.首先前导0没用,只是最后移位。
2.第一个1肯定是要在的。而且整个过程是唯一的。(一旦得到第二个1,那就停止)
这个过程可以看成乘法过程。(异或看成在2域下的加法)。
于是S(x)*(sigma xi)=x^k+1
令后面的sigma xi=F(x),那么考虑只关心x^k,那么直接对S(x)取模
于是就变成了x^k=S(x)-1(%S(x))
于是变成bsgs。但是取模需要定义。
考虑取模实际上是T(x)*S(x)+G(x)=F(x)*x ,我们要求G(x)
假设两个多项式deg相同,那么取T(x)=1, 于是G(x)=x*(F(x))-S(x)=x*(F(x))+S(x)
如果不一样,那么就 T(x)=0,即可。
他给出了值域的sigma作为限制,可以比较自然的联想到枚举最小值。考虑到我们可以通过固定最小值,求出最小的最大值,来最小化极差。我们可以先枚举最小值,然后用dp或者贪心来做所有数分解成大于这个最小值的因子,最小的最大值。
我的第一思路是觉得,贪心不行,选择dp。
再考虑,一个数,在最小数变化的过程中,最大数会变化的地方当且仅当是出现在,最小值是因数的情况下。
那么我们相当于维护折线段可以做?
或者是,通过这个条件,我们发现,我们可以调和级数复杂度来做(因为在枚举最小值的过程中,我们只要枚举倍数,就能知道他影响了哪些数,或者是会造成哪些dp值的更新)
考虑dp的更新,dp[x]表示x这个数,分解成大于等于lim的因子,最小的最大因子是多少。
dp[x]=min(dp[x],dp[x/lim],dp[x/lim/lim]…);
可以多重背包优化。相当于dp[x]=min(dp[x],dp[x/lim])
。。。人傻了。最基本的都没想到。
观察1:一个图满足条件,当且仅当每个点四周都有至少一个比他小的数。
那么我们显然可以把不满足条件的点取出来(选其中之一),把这个点周围的4个再加上他本身,这五个点中其中一个必然要交换,再另选一个点,模拟交换即可
待填坑