定義 $pop(n)$ 表示 n 二進位制下 1 的個數
可以發現 $b_n=pop(n)\bmod(2)$
考慮去掉模運算,$b_n=\frac(1-(-1)^)$
那麼可以有以下推導
可以將 n 二進位制拆分成若干段,具體地,對於乙個這樣的數 $(10110)_2$
可以拆分成這些段:
算算後發現複雜度是 $o(m^2\log n+m^3)$
通過打表發現或者歸納證明
當 $x>2^t$ 或者 $t>k$ 時,$f(x,t,k)=0$,所以 $f$ 的規模縮小到 o(m) 級別
複雜度 $o(m^3+\log n)$
考慮列舉 b 序列子區間,同時 a 陣列用乙個指標從左往右一路掃過去,複雜度 $o(n^2)$
關鍵在於如何子串判重,總共 $o(n^2)$ 個串需要 $o(1)$ 判重
手寫雜湊表即可,單模雜湊可能被卡,寫了個雙模
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 3007
#define inf 0x7fffffff
#define ll long long
#define uint unsigned int template
inline
void read(i &num)
template
inline
void read(i &a, i &b)
template
inline
void read(i &a, i &b, i &c)
intn, ans;
char
s[inf], t[inf];
const
int p = 10025051
;const
int bp = 1019260817
;const
intbase = 127
;class
hashlist ;
int head[p + 2
]; listnode lst[p + 2
];
intindex;
inline
bool
insert(ll x)
else
lst[now].nxt = ++index;
lst[index].v =x;
return1;}}
};hashlist hl;
inline
void
setting()
signed main()
if(now > n) break
; hash1 = 1ll * (hash1 * base + t[r]) %bp;
hash2 = (hash2 * base +t[r]);
ans += hl.insert(1ll * hash2 * (1000000000) +hash1);}}
std::cout
<< ans << '\n'
;
return0;
}
遊記 NOI Online 2021 遊記
考前成功為自己攢夠了人品。指前幾天的模擬賽統統爆零 8 30 拿到題面 還好伺服器沒卡。一看三個題,都是 256mb,最後一題 2s,不開 o2 屑人吧!然後乙個乙個題看 t1 計數,沒啥思路,不過這個構造方式非常的格雷碼。t2 看起來非常可做,不過粗略看過去感覺題意不太清楚。t3 看就非常資料結構...
NOI Online 3 提高組 第一題 水壺
題目鏈結 其實這道題也不算是特別難,也跟普及組的題目的難度差不多。題目基本演算法 最大欄位和 字首和維護 由於水都是正數,我們能加多少就加多少,故我們必須要用完k kk次。而且我們要保證我們最後都能把所有水加到一杯水裡面去,所以題目就轉化成了求一段長度為k 1 k 1 k 1的最大子段和。inclu...
2021 BUAA OO第一單元總結
oo第一單元總結 第一次作業 一 題目要求 簡單多項式求導,僅支援常數與冪函式的乘積作為項,保證輸入無格式錯誤。二 作業實現及分析 由於第一次作業要求實現的功能並不複雜,且我當時對於物件導向的理解並不夠深入,所以我當時只是根據自己的想法構建了4個類來解決這個問題 類圖如下 關鍵類分析如下 strin...