BZOJ5330 SDOI2018 反回文串

2022-04-28 19:57:09 字數 2261 閱讀 3502

luogu

bzoj

列舉乙個長度為\(n\)為回文串,它的所有迴圈位移都可以產生貢獻。

但是這樣算重了。重複的地方在於可能多個回文串迴圈同構,或者可能有的回文串經過小於\(n\)次迴圈位移後能夠得到自身。

乙個比較好的處理方式是:對每個回文串求最小的\(x\)使這個串經過\(x\)次迴圈位移後可以再次成為乙個回文串。這樣對每個回文串求\(\sum x\)顯然就不會算重了。

考慮乙個串的\(x\)是什麼。顯然會和這個串的最小迴圈節長度有關。實際上如果最小迴圈節長度為偶數,那麼\(x\)就會是這個長度的一半;否則就等於這個長度。

形式化地,如果乙個回文串的最小迴圈節長度為\(i\),那麼它對答案的貢獻就是\(h(i)=i\frac]}\)。

設最小迴圈節為\(i\)的回文串共有\(f(i)\)個,那麼我們要求的答案就是

\[ans=\sum_f(d)h(d)

\]又因為$$\sum_f(d)=k^=g(n)$$

所以$$f(n)=\sum_g(d)\mu(\frac nd)$$

代入原式$$ans=\sum_\sum_g(i)\mu(\frac di)h(d)\=\sum_g(i)\sum_\mu(d)h(id)$$

我們希望可以把\(h(id)\)中的\(i\)提出來,這樣後半部分就是乙個關於\(\frac ni\)的函式了。

因為\(h(x)\)不是\(x\)就是\(\frac x2\),我們發現\(h(id)\neq d\times h(i)\)當且僅當\(i\)是奇數且\(d\)是偶數,而\(d|\frac ni\)所以\(d\)是偶數就說明\(\frac ni\)也是偶數。那麼我們現在假設\(i\)是奇數且\(\frac ni\)是偶數,考慮下面這個式子的取值。

\[\sum_\mu(d)h(id)

\]顯然只有\(\mu(d)\)非零項有貢獻,而\(\frac ni\)中含有\(2\)這個因子就使得所有\(\mu(d)\)非零項中含\(2\)與不含\(2\)的\(d\)可以一一對應。他們的\(h(id)\)的值是相同的,而\(\mu(d)\)的值恰好相反,所以這個式子的值一定為\(0\)。

話說回來。我們現在已經知道了\(h(id)\neq d\times h(i)\)的情況沒有貢獻,就可以放心大膽地用這一種變換了。

\[ans=\sum_g(i)\sum_\mu(d)h(id)\\=\sum_g(i)h(i)\sum_d\mu(d)

\](在列舉\(i\)時需要跳過\(i\)是奇數而\(\frac ni\)是偶數的項)

考慮後面的東西是個啥。還是只有\(\mu(d)\)非零項有貢獻,也就是說含有奇數個質因子的\(d\)會乘上\(-1\),含有偶數個質因子的\(d\)為乘上\(1\),所以這個值相當於是將\(\frac ni\)質因數分解為\(p_1^p_2^...p_k^\)後,為\(\prod_^k(1-p_i)\)。

所以到這裡就比較簡單了。先用\(pollard-rho\)演算法將\(n\)分解,再dfs列舉\(n\)的每乙個約數\(d\),在搜尋的過程中自然可以求出那個\(\prod_^k(1-p_i)\)。

#include#include#includeusing namespace std;

#define ll long long

ll mul(ll x,ll y,ll m)

ll fastpow(ll x,ll y,ll m)

return res;

}ll f=;

bool mr(ll p)

} return true;

}ll pr(ll n,ll c)

}ll tmp[100];int len;

void fact(ll n)

ll p=n;for (int c=233;p==n;--c) p=pr(p,c);

fact(p);fact(n/p);

}int case,q[100],cnt,mod;ll n,k,p[100],ans;

int fpow(int x,ll y)

return res;

}int g(ll n)

int h(ll n)

void dfs(int i,ll d,int pro)

dfs(i+1,d,pro);pro=1ll*pro*(mod+1-p[i]%mod)%mod;

for (int j=1;j<=q[i];++j) d*=p[i],dfs(i+1,d,pro);

}int main()

ans=0;dfs(1,1,1);printf("%lld\n",ans);

} return 0;

}

Bzoj 2726 SDOI 任務安排

memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...

BZOJ 3991 SDOI2015 尋寶遊戲

題目大意 給定一棵樹,其中有若干個關鍵點,任意選擇起點,求從起點出發訪問所有關鍵點又回到起點的最小邊權總和,有m個修改操作,每次修改乙個關鍵點。假如沒有修改操作的話,就像乙個簡單的樹形dp,方程如下 f i sigma sigma.觀察一下dp的過程,就是不斷地從前面的點走到後面的點,所以我們可以不...

SDOI2013 BZOJ3203 保護出題人

description input 第一行兩個空格隔開的正整數n和d,分別表示關數和相鄰殭屍間的距離。接下來n行每行兩個空格隔開的正整數,第i 1行為ai和 xi,分別表示相比上一關在殭屍佇列排頭增加血量為ai 點的殭屍,排頭殭屍從距離房子xi公尺處開始接近。output 乙個數,n關植物攻擊力的最...