分式分解——2025.6.8 鮮花
分式分解——2025.6.8 鮮花
余命2:30
あ 生まれた
何をして生きようか
無限の可能性が広がる まだ8秒だ
あんなことできるかな
何にでもなれるかな
來るべき不幸から
目を背けながら
真面目に生きようか
小狡く生きようか
君を助けたい 蹴落としたい
どっちも自分だ
夢や戀はファストで
努力はつらいよね
本や映畫は
あらすじだけでいいかな
余命2:30
余命2:30
「ありがとう」「さよなら」
「またね」をくり返して
もう45秒の春
余命2:30
使い捨てられる青
3分に満たない
替えが利く ぼくの命を
涙で消費しないでね
夢ってこんなもんか
戀ってこんなもんか
人生ってまるで
よくある歌みたいだな
1分以上過ぎて
「自分」を思い知って
だけど 悟るには まだまだ早いね
チクタク チクタク
もういない君を想う
1分前 描いた夢とは ほど遠いが
余命2:30
余命2:30
「よかった」「もうだめだ」
「まあいっか」をくり返して
1分45秒の秋
余命2:30
また一つ消える魔法
君のため?ぼくのため?
大袈裟に嘆く命を
どうか美化しすぎないでね
あの日 読み飛ばした
本や映畫みたいに
ぼくの命も 短い歌になって
余命2:30でさよならでも
幸せだったと言わせて欲しいの
余命2:30
余命2:30
3分に満たない
もう終わる ぼくの命を
人事って思わないでね
あ

比較易。
未加說明則 \(x\) 是多項式的變量。
設分式形如 \(F = \frac 1{\prod\limits_i Q_i}\),我們想把他分解成 \(\sum\limits_i \frac{R_i}{Q_i}\),其中 \(\deg R_i < \deg Q_i\)。
有:
考慮 \(\deg\) 的限制,我們對 \(Q_i\) 取模。
這個東西用處只在于其形式,用來做類似 EI 營業日志 2020.5.20。
正常的實現這個感覺都 \(n^2\log^2 n\sim n^3\) 了。
Upd:jijidawang 說 EI 已經 \(n\log^2 n\) 了,不過我不會
我們在 \(Q_i = 1 - a_ix\) 時給出一個更正常的 \(n ^ 2\) 做法。
考慮取模的意義,實際上是去掉其他項的貢獻,我們用一個類似拉差的做法做到這個。
設原式
通分后 \(R_i\) 的限制
我們取 \(x = \frac 1{a_k}\),容易發現此時所有 \(i \not= k\) 的項全等于 \(0\),所以此時有
即可解出
例題:AT_abc241_h [ABC241Ex] Card Deck Score
直接整出生成函數
考慮分子的系數直接 \(\mathcal{O}(n2^n)\) 枚舉即可,重點在于分母的系數。
我們直接套用分式分解,將
改寫成
則可以 \(\mathcal{O}(n\log P)\) (\(P = 998244353\) 為模數)求單次系數,將枚舉分子的 \(2^n\) 個系數帶入即可。
總復雜度是 \(\mathcal{O}(n2^n\log P)\) 的。
Code
/*
clear && g++ % -o %< -O2 -std=c++14 -DLOCAL -Wall -Wextra && time ./%< && size %<
clear && g++ % -o %< -O2 -std=c++14 -DLOCAL -Wall -Wextra -fsanitize=address,undefined -g && time ./%< && size %<
echo && cat in_out/out.out && echo
*/
#include <bits/stdc++.h>
using namespace std;
using llt = long long;
using llf = long double;
using ull = unsigned long long;
#define endl '\n'
#ifdef LOCAL
FILE *InFile = freopen("in_out/in.in", "r", stdin), *OutFile = freopen("in_out/out.out", "w", stdout);
#endif
const int N = 20, MOD = 998244353;
int n; llt _a[N], _b[N], tt[N], m;
int Fpw(int a, int b){
int ans = 1;
for(; b; a = 1ll * a * a % MOD, b >>= 1) if(b & 1) ans = 1ll * ans * a % MOD;
return ans;
}
int Inv(int a){ return Fpw(a, MOD - 2); }
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; ++i) cin >> _a[i] >> _b[i], _b[i] += 1, _a[i] %= MOD;
for(int i = 1; i <= n; ++i){
int s = 1, v = Inv(_a[i]);
for(int j = 1; j <= n; ++j) if(j != i) s = s * (1 - v * _a[j] % MOD) % MOD;
tt[i] = Inv(s);
}
llt ans = 0;
for(int i = 0, cs = (1 << n) - 1; i <= cs; ++i){
llt c = 0, t = 1;
for(int j = 1; j <= n; ++j) if((i >> (j - 1)) & 1)
c += _b[j], t = 1ll * t * -Fpw(_a[j], _b[j] % (MOD - 1)) % MOD;
c = (m - c) % (MOD - 1); if(c < 0) continue;
for(int j = 1; j <= n; ++j) ans = (ans + 1ll * t * Fpw(_a[j], c) % MOD * tt[j]) % MOD;
}
cout << (ans % MOD + MOD) % MOD;
}
P




本文來自博客園,作者:xrlong,轉載請注明原文鏈接:http://www.rzrgm.cn/xrlong/p/18919842
版權聲明:本作品采用 「署名-非商業性使用-相同方式共享 4.0 國際」許可協議(CC BY-NC-SA 4.0) 進行許可。

浙公網安備 33010602011771號