洛谷 P6667 [清华集训2016] 如何优雅地求和
点值不好搞。考虑把它搞成系数一类的东西。
由二项式反演,。
然后我们要求:
然后把 拆成 ,利用二项式定理合并即可。
可以一遍加法卷积求。
code
// Problem: P6667 [清华集训2016] 如何优雅地求和 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P6667 // Memory Limit: 128 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ldb; typedef pair<ll, ll> pii; const int maxn = 100100; const ll mod = 998244353, G = 3; inline ll qpow(ll b, ll p) { ll res = 1; while (p) { if (p & 1) { res = res * b % mod; } b = b * b % mod; p >>= 1; } return res; } ll n, m, X, a[maxn], r[maxn], b[maxn], fac[maxn], ifac[maxn], inv[maxn]; typedef vector<ll> poly; inline poly NTT(poly a, int op) { int n = (int)a.size(); for (int i = 0; i < n; ++i) { if (i < r[i]) { swap(a[i], a[r[i]]); } } for (int k = 1; k < n; k <<= 1) { ll wn = qpow(op == 1 ? G : qpow(G, mod - 2), (mod - 1) / (k << 1)); for (int i = 0; i < n; i += (k << 1)) { ll w = 1; for (int j = 0; j < k; ++j, w = w * wn % mod) { ll x = a[i + j], y = w * a[i + j + k] % mod; a[i + j] = (x + y) % mod; a[i + j + k] = (x - y + mod) % mod; } } } if (op == -1) { ll inv = qpow(n, mod - 2); for (int i = 0; i < n; ++i) { a[i] = a[i] * inv % mod; } } return a; } inline poly operator * (poly a, poly b) { a = NTT(a, 1); b = NTT(b, 1); int n = (int)a.size(); for (int i = 0; i < n; ++i) { a[i] = a[i] * b[i] % mod; } a = NTT(a, -1); return a; } void solve() { scanf("%lld%lld%lld", &n, &m, &X); fac[0] = 1; for (int i = 1; i <= m; ++i) { fac[i] = fac[i - 1] * i % mod; } ifac[m] = qpow(fac[m], mod - 2); for (int i = m - 1; ~i; --i) { ifac[i] = ifac[i + 1] * (i + 1) % mod; } inv[1] = 1; for (int i = 2; i <= m; ++i) { inv[i] = (mod - mod / i) * inv[mod % i] % mod; } for (int i = 0; i <= m; ++i) { scanf("%lld", &a[i]); } int k = 0; while ((1 << k) <= (m + 1) * 2) { ++k; } for (int i = 1; i < (1 << k); ++i) { r[i] = (r[i >> 1] >> 1) | ((i & 1) << (k - 1)); } poly A(1 << k), B(1 << k); for (int i = 0; i <= m; ++i) { A[i] = ifac[i] * a[i] % mod; B[i] = ifac[i] * ((i & 1) ? mod - 1 : 1) % mod; } poly C = A * B; for (int i = 0; i <= m; ++i) { b[i] = C[i] * fac[i] % mod; } ll c = 1, ans = 0, pw = 1; for (int i = 0; i <= m; ++i) { ans = (ans + b[i] * c % mod * pw % mod) % mod; c = c * (n - i) % mod * inv[i + 1] % mod; pw = pw * X % mod; } printf("%lld\n", ans); } int main() { int T = 1; // scanf("%d", &T); while (T--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2022-07-14 CodeForces 983D Arkady and Rectangles
2022-07-14 CodeForces 1662F Antennas