5372 Pkusc2018 神仙的遊戲

2021-08-20 15:03:08 字數 2700 閱讀 4983

這題務必用fft寫,反正ntt我bzoj一直tle,loj 8s

做這題首先要知道乙個性質,如果選取長度為len的串,那麼該串可行,一定滿足不存在一對 01,其距離相差len

(x而不是一開始我想的類似 另外乙個fft的題…

那麼如果存在一對01其距離差為len,那麼對於所有k|len的串都不可行。

考慮首先求出所有01串的差值len, 暴力n^2肯定不行

考慮兩個陣列a,b,若s[i] = 0則 a[i] = 1,否則 b[i] = 1

那麼對於兩個位置 a[i] = 1, b[j] = 1,abs(j - i)就是乙個不合法情況

考慮用fft怎麼優化,容易知道令a[

i]=a

[i]∗

xib[

i]=b

[i]∗

xia [i

]=a[

i]∗x

ib[i

]=b[

i]∗x

i那麼 a[

i]∗b

[j]=

a[i]

∗b[j

]∗xi

+ja [i

]∗b[

j]=a

[i]∗

b[j]

∗xi+

j而想要的到的是 i-j,那麼考慮把其中乙個陣列反轉,即 j變為 n-j+1

那麼此時轉化為a[

i]∗b

[n−j

+1]=

a[i]

∗b[j

]∗xi

+n−j

+1a [i

]∗b[

n−j+

1]=a

[i]∗

b[j]

∗xi+

n−j+

1那麼這個時候很顯然fft能直接優化了,搞定

複雜度o(n

logn

) o(n

log⁡n)

fft:

#include

#define rep(i,x,y) for(register int i = x; i <= y; ++ i )

#define repd(i,x,y) for(register int i = x; i >= y; -- i )

typedef

long

long ll;

using

namespace

std;

template

inline

void read(t&x)

while(!isdigit(c));

do while(isdigit(c));

x *= sign;

}const

int g = 3,p = 998244353,n = 2e6 + 50;

bool c[n],d[n];

int n,l,r[n];

char s[n];ll ans;

struct cpx

cpx(double x,double y)

cpx operator * (cpx y)

cpx operator *= (cpx y)

cpx operator - (cpx y)

cpx operator + (cpx y)

}a[n],b[n];

#define pi acos(-1)

void fft(cpx*a,int f)}}

if(f == -1) rep(i,0,n-1) a[i].a /= n;

}int main()

else

if(!c[i]) ans ^= 1ll * (m-i) * (m-i);

cout

<< ans << endl;

return

0;}

ntt:

#include

#define rep(i,x,y) for(register int i = x; i <= y; ++ i )

#define repd(i,x,y) for(register int i = x; i >= y; -- i )

typedef

long

long ll;

using

namespace

std;

template

inline

void read(t&x)

while(!isdigit(c));

do while(isdigit(c));

x *= sign;

}const

int g = 3,p = 998244353,n = 2e6 + 50;

int a[n],b[n];bool c[n],d[n];

int n,l,r[n];

char s[n];ll ans;

inline

int ksm(int x,int y)

return ans;

}void ntt(int*a,int f)}}

if(f == -1)

}int main()

else

if(!c[i]) ans ^= 1ll * (m-i) * (m-i);

cout

<< ans << endl;

return0;}

PKUSC2018 神仙的遊戲

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

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

LOJ6436 PKUSC2018 神仙的遊戲

loj 給你乙個只有01和?的字串,問你是否存在一種把?改成01的方案使串存在乙個長度為 1 n 的 border n le5 times10 5 這種題都不會我還是太菜了。有一檔部分分是 01的個數不超過 5000 這個其實對正解的提示是蠻大的。有乙個顯然的結論 存在乙個長度為 len 的 bor...