清華集訓2016 石家莊的工人階級隊伍比較堅強

2022-04-07 22:47:51 字數 2597 閱讀 1081

給定 \(m\),然後令 \(n=3^m\),給定陣列 \(f_,f_...f_\)

給定陣列 \(b\),然後定義卷積:

\[f_=\sum_f_b_

\]其中 \(u\) 定義為 \(w(x,y)\),\(v\) 定義為 \(l(x,y)\)

其中 \(w(x,y)\) 被定義為將三進製的每一位進行比較,出現一組10/21/02就累加一次貢獻,\(l(x,y)\) 定義為 \(w(y,x)\)

你需要計算 \(f_\),\(t\) 給定。

答案對 \(p\) 取模,保證不存在 \(x,y\) 滿足 \(\frac+\frac=\frac\)

\(m\le 12,t\le 10^9,p\le 10^9\)

又來水題解了。

考慮三進製不退位減法:

\[\begin

0\oplus 0=0&0\oplus 1=2&0\oplus 2=1

\\1\oplus 1=0&1\oplus 2=2&1\oplus 0=1

\\2\oplus 2=0&2\oplus 0=2&2\oplus 1=1

\end\]

我們發現結果為 \(1\) 等價於 win,結果為 \(2\) 等價於 lose

設 \(bit_k(x)\) 表示 \(x\) 中的 \(k\) 的數量。

那麼我們有轉移形如:

\[f_=\sum_y f_b_

\]不難發現貢獻實際上只和 \(x\oplus y\) 相關。

設 \(\odot\) 表示三進製不進製加法,那麼不難發現:

\[f_=\sum_ f_b_

\]於是相當於計算 3 進製下異或卷積的 \(k\) 次冪。

我們搞出 fwt 的點值即可處理了。

注意到 \(k\) 進製 fwt 相當於在做迴圈卷積,這樣我們只需要將給 \(k\) 進製單位根代入進去即可。

具體式子:

\[fwt(i)=\sum_ c(i,j)a_j

\]\[fwt(i)=\sum_^ c(i_},j)\sum c(i',j')a_}}

\]\[fwt(i)=\sum_^ \omega_^}j}\sum c(i',j')a_}}

\]這樣遞迴即可,由於只需要乘以單項式,所以複雜度是 \(\mathcal o(k^)\) 的。

由於要次冪一下,會掉精度,所以只能擴域,我們找乙個代數單位來表示 \(\omega_3\)

根據單位根的性質,我們注意到 \(\omega_3^2+\omega_3+1=0\),這樣的話就有 \(\omega_3^2=-\omega_3-1\)

這樣我們先相當於拿著 \(ax^2+bx+c\) 型別的多項式在模(?)上做運算,最後我們再把 \(a\) 表示成 \(b,c\) 相關消一消。

然後發現這個題卡這個做法,然後你會發現沒必要 fwt 的時候取模,所以可以最後取模。

然後手動迴圈展開一下,就可以過了。最後放一下比較醜的**

\(code:\)

#includeusing namespace std ;

#define next( i, x ) for( register int i = head[x]; i; i = e[i].next )

#define rep( i, s, t ) for( register int i = (s); i <= (t); ++ i )

#define drep( i, s, t ) for( register int i = (t); i >= (s); -- i )

#define re register

#define int long long

int gi()

while( cc >= '0' && cc <= '9' ) cn = cn * 10 + cc - '0', cc = getchar() ;

return cn * flus ;

}const int n = 1e6 + 5 ;

const int m = 20 + 5 ;

int lim, m, t, p, b[m][m] ;

struct gf

} f[n], g[n], nx[n] ;

int fpow(int x, int k) return ans ;

}void inc(int &x, int y)

int bit1(int x)

int bit2(int x)

gf move(gf x, int l)

gf operator * (gf x, gf y)

gf operator * (gf x, int y)

gf operator + (gf x, gf y)

gf fpow(gf x, int k) return ans ;

}gf operator % (gf x, int p)

void fwt(gf *a)

}void ifwt(gf *a)

}int phi(int x) if( x != 1 ) ans = ans - ans / x ;

return ans ;

}signed main()

return 0 ;

}

清華集訓2016 汽水

試題描述 牛牛來到了乙個盛產汽水的國度旅行。這個國度的地圖上有n個城市,這些城市之間用 n 1 條道路連線,任意兩個城市之間,都存在一條路徑連線。這些城市生產的汽水有許多不同的風味,在經過道路 i 時,牛牛會喝掉 wi 的汽水。牛牛非常喜歡喝汽水,但過量地用汽水是有害健康的,因此,他希望在他旅行的這...

清華集訓2016 資料互動

題目描述 乙個簡單的網路系統可以被描述成一棵無根樹。每個節點為乙個伺服器。連線伺服器與伺服器的資料 線則看做一 條樹邊。兩個伺服器進行資料互動時,資料會經過連線這兩個伺服器的路徑上的所有服務 器 包括這兩個伺服器 自身 每個資料互動請求都有乙個非負的重要度,越重要的請求顯然需要得 到越高的優先處理權...

清華集訓2016Day4

用盧卡斯定理可知滿足條件即將 n 和 m 分別用 k 進製表示,要求 n 的每一位都要大於等於 m 的對應位。直接數字 dp 設 f 表示處理到第 i 位,n 是否觸上界,m 是否觸上界時的方案數。複雜度 o t log kn include include includeusing namespa...