PKUSC2018 神仙的遊戲

2022-05-11 15:40:29 字數 1165 閱讀 4634

這道題感覺還是不太難的。。。

考慮若存在乙個長度為\(len\)的\(border\),那麼對於\(\forall i\in [1,len]\)都有\(s[i]=s[n-len+i]\)

注意到下標之間的差值為\(n-len\),也就是說,所有下標差為\(n-len\)的位置必須相同

這裡的相同包括某乙個是\(?\)的情況,也就是說\(?\)其實是沒有影響的

有了上面的條件,我們可以發現若有一對\((0,1)\)的位置相差\(l\),那麼對於所有的\(x|l\),都不存在長度為\(n-x\)的\(border\)

我們已經知道本題的關鍵就是\((0,1)\)對了,那麼如何來找呢?

考慮構造兩個生成函式\(a(x),b(x)\)

\[a(x)=\sum_^ x^i[s_i=0]\\

b(x)=\sum_^ x^i[s_i=1]\\

\]我們知道卷積的形式就是指數相加,和為定值,那麼我們現在要的是差為定值,那麼把其中乙個生成函式\(reverse\)即可

現在我們得到了新的\(c(x)=a(x)b(x)\),\(c(x)\)的第\(i\)係數即為下標差為\(i-n\)的\((0,1)\)對數

最後我們再列舉下標差即可,時間複雜度\(o(n \log n)\)

#include#define pi acos(-1.0)

#define int long long

using namespace std;

const int n=2e6+10;

const double eps=1e-3;

char s[n];

int n,ans,len=1,tim,rtt[n],f[n];

struct cpa[n*2],b[n];

cp operator + (cp a,cp b);}

cp operator - (cp a,cp b);}

cp operator * (cp a,cp b);}

void fft(cp *a,int flag)}}

}signed main()

if(flag) ans=ans^((n-i)*1ll*(n-i));

}ans^=(n*1ll*n);

printf("%lld\n",ans);

return 0;

}

PKUSC2018 神仙的遊戲 題解

小d和小h發現了一種新的遊戲。給出乙個由0 1 組成的字串 s 將 s 中的問號用0 1替換,對每個 l 口算是否存在替換問號的方案使得 s 長度為 l 的字首成為border,把這個結果記做 f l 0 1 請計算 f 1 times 1 2 otimes f 2 times 2 2 otimes...

5372 Pkusc2018 神仙的遊戲

這題務必用fft寫,反正ntt我bzoj一直tle,loj 8s 做這題首先要知道乙個性質,如果選取長度為len的串,那麼該串可行,一定滿足不存在一對 01,其距離相差len x而不是一開始我想的類似 另外乙個fft的題 那麼如果存在一對01其距離差為len,那麼對於所有k len的串都不可行。考慮...

PKUSC 2018 真實排名

戳我 我們將現在所要進行的數設為 now 我們分情況討論一下 他自己不翻倍 他自己翻倍 我們首先來看看 1 操作 如果要滿足他對排名沒有影響,那麼不能進行翻倍的數只有 lceil frac rceil,now 我考場上不知道在幹嗎,寫的是能進行翻倍的數,麻煩好多,常數也大 我們假設這一段為 cnt ...