給定 \(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...