CF1967C Fenwick Tree 题解
题意:定义
f(a) 表示将a 序列变为其所对应的树状数组。已知f^k(a)=b ,给定长度为n 的序列b ,求a 序列。
很神奇的一道组合题。
首先我们考虑树状数组的结构。会发现
于是我们知道了每一个点对其祖先的贡献。又因为我们已知最终的
因为每个点在树状数组上的祖先最多有
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 10;
const int mod = 998244353;
int T,n,a[MAXN],inv[MAXN],k;
inline int Lowbit(int x) {return (x & -x);}
signed main() {
inv[0] = inv[1] = 1;
for(int i = 2;i < MAXN;i++)
inv[i] = inv[mod % i] * (mod - mod / i) % mod;
for(cin >> T;T;T--,puts("")) {
cin >> n >> k;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int v = 1;v <= n;v++) {
int C = 1;
for(int d = 1,u = v + Lowbit(v);u <= n;u += Lowbit(u),d++) {
C = C * ((d + k - 1) * inv[d] % mod) % mod;
a[u] = (a[u] - C * a[v] % mod + mod) % mod;
}
}
for(int i = 1;i <= n;i++) cout << a[i] << " ";
} return 0;
}