PKUSC2018 神仙的遊戲 題解

2022-08-11 18:03:12 字數 1163 閱讀 7982

​ 小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 \cdots \otimes (f(n) \times n^2)\) 。

\(|s| \leq 5 \times 10^5\)

對於乙個長度為 \(len\) 的border,必定會有 \(s_=s_\) 。

我們可以得到乙個這樣的性質:若任取 \(i \equiv j (\mod x)\) ,都有 \(s_i=s_j\) ,則 \(n-x\) 是乙個border。

所以,倘若 \(i \equiv j (\mod x)\) ,\(s_i \neq s_j\) ,則 \(n-x\) 必定不是乙個border。即只要知道有一對01的差是 \(d\) ,就一定會有對於乙個 \((n-len)|d\) , \(len\) 都不是乙個border。

所以我們只要求出兩兩01的差,就能判斷border,而這個只要fft即可。

#include#define db double

#define ll long long

using namespace std;

const db pi=acos(-1);

ll n,ans;

char s[500005];

int vis[500005],rev[2000005];

struct complex;

}inline complex operator - (const complex &a)const;

}inline complex operator * (const complex &a)const;

}}f[2000005],g[2000005];

void fft(complex *f,int lim,int op)

}if(flag)

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

}printf("%lld\n",ans^(1ll*n*n));

return 0;

}

PKUSC2018 神仙的遊戲

這道題感覺還是不太難的。考慮若存在乙個長度為 len 的 border 那麼對於 forall i in 1,len 都有 s i s n len i 注意到下標之間的差值為 n len 也就是說,所有下標差為 n len 的位置必須相同 這裡的相同包括某乙個是 的情況,也就是說 其實是沒有影響的 ...

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 ...