题解 ABC309Ex【Simple Path Counting Problem】
好好玩的题。
设普通生成函数 ,其中 表示从所有起点走到 的方案数。特别地,。
注意到 几乎成立,但是在 和 处不成立。
尝试对 进行改造:
考察 与 的循环卷积(即 的结果),发现由于 是由 沿着 翻折并取相反数得到的, 和 永远会是 ,这就防止了我们移动到网格外,从而使得循环卷积结果的系数恰好是 的各项系数,即:
使用快速幂即可,时间复杂度 。
去掉封装的核心代码:(完整代码)
Poly<mod, g> qmul(const Poly<mod, g>& a, const Poly<mod, g>& b) {
Poly<mod, g> ans = a * b;
int sz = (int)ans.size();
rep(i, 2*m+2, sz-1) ans[i%(2*m+2)] += ans[i];
ans.resize(2*m+2);
return ans;
}
Poly<mod, g> qpow(Poly<mod, g> a, int k) {
Poly<mod, g> ans{1};
for(; k; k >>= 1, a = qmul(a, a)) if(k & 1) ans = qmul(ans, a);
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
initPoly(N);
cin >> n >> m >> k >> l;
Poly<mod, g> a(2*m+2), b(2*m+2);
rep(i, 1, k) {
cin >> x;
++a[x];
--a[2*m+2-x];
}
b[0] = b[1] = b[2*m+1] = 1;
a = qmul(a, qpow(b, n-1));
Modint<mod, g> ans = 0;
rep(i, 1, l) {
cin >> x;
ans += a[x];
}
cout << ans << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现