這題務必用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
logn)
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...