注意到如果排列不是内卷的,则它和自己的逆排列不同,而一个排列和逆排列的逆序对个数相等。因此,我们只需要对于所有排列计数即可(不是内卷的排列会和逆排列在mod 2意义下抵消)。
一种数排列的方法是确定每个元素前面有几个元素比它大,逆序对的个数就是这些数之和。即我们要数的就是 $\forall i\in[1,n],~b_i\in[0,i), \sum_i b_i=u$ 的方案数 mod 2。
考虑生成函数,这个就是 $[x^u]\prod_i (1+x+x^2+...+x^i)=[x^u]\prod_i (1-x^{i+1})/(1-x)\equiv[x^u](1+x+x^2+...)^n\prod_i (1+x^{i+1})$。
我们使用 bitset 维护此多项式,$\prod_i (1+x^{i+1})$ 可以直接每次将多项式乘上 $1+x^{i+1}$(x=x^(x<<(i+1))),对于 $i\ge k$ 就不需要乘了。
乘上 $(1+x+x^2+...)^n$ 即将原序列前缀和 $n$ 次,原序列中位置 $i$ 对新序列位置 $j$ 的贡献即 $n$ 个非负整数和为 $j-i$ 的方案数,即 $j-i+n-1 \choose n-1$。枚举 $u=j-i$,若 $u+n-1 \choose n-1$ 为奇数则将原多项式乘上 $1+x^u$ 即可。判断是否为奇数可以使用卢卡斯定理。
时间复杂度 $O(k^2/w)$。