CF1398G Running Competition 题解
设 \(c_i=0/1\) 表示 \(i\) 有没有在 \(a\) 中出现,那么这个就是他自己和自己的差卷积,卷出来之后不是 \(0\) 的位置就都可以,每个可以的位置更新一下自己的倍数就行(或者使用狄利克雷前缀和,不过暴力做复杂度也过得去)。
差卷积就翻一下序列然后 FFT 就行了。
点击查看代码
const int N=8e5+13,M=1e6+13;
const int G=114514,Gi=qpow(G,mod-2);
int n,m,in[N],a[N],b[N],c[M],r[N];
inline void fft(int *f,int limit,int type){
for(int i=0;i>1]>>1)|((i&1)<<(l-1));
fft(a,limit,1),fft(b,limit,1);
for(int i=0;i