版权声明:本文是蒟蒻写的,转载。。。随便吧 https://blog.csdn.net/xgc_woker/article/details/86651106
Description
给你一个b序列,求x序列,b和x满足下式。
Sample Input
3 1 0 2
1 0 0
1 2 3
Sample Output
499122179 998244352 499122176
998244352 1 1
式子首先可以化成:
我们考虑设
为
,
为
,
为
。
考虑莫反搞掉这个
,设
。
设
,那么式子变为:
设
,
设
,
莫反一下,这样就搞得出
,进而搞得出
。
对于这个
再莫反一下,就搞得出
。
搞出了
,这提就做完了。
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 300001;
const LL mod = 998244353;
int read() {
int s = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * f;
}
void put(int x) {
if(x >= 10) put(x / 10);
putchar(x % 10 + '0');
}
LL w[N], g[N], f[N], fr[N], F[N], q[N], t[N], x[N];
int plen, p[N], mu[N];
bool v[N];
void get_p() {
mu[1] = 1;
for(int i = 2; i < N; i++) {
if(!v[i]) p[++plen] = i, mu[i] = -1;
for(int j = 1; j <= plen && (LL)p[j] * i < N; j++) {
v[i * p[j]] = 1;
if(i % p[j] == 0) {mu[i * p[j]] = 0; break;}
mu[i * p[j]] = -mu[i];
}
}
}
LL pow_mod(LL a, int k) {
LL ans = 1;
k = (k + mod - 1) % (mod - 1);
while(k) {
if(k & 1) (ans *= a) %= mod;
(a *= a) %= mod; k /= 2;
} return ans;
}
int main() {
int n = read(), c = read(), d = read(), tt = read();
get_p();
for(int i = 1; i <= n; i++) g[i] = pow_mod(i, d), f[i] = pow_mod(i, c - d);
for(int i = 1; i <= n; i++) {
for(int j = i, s = 1; j <= n; j += i, s++) {
(fr[j] += mu[s] * f[i]) %= mod;
} (fr[i] += mod) %= mod;
}
while(tt--) {
bool bk = 0;
memset(F, 0, sizeof(F));
memset(t, 0, sizeof(t));
for(int i = 1; i <= n; i++) w[i] = read(), w[i] = w[i] * pow_mod(g[i], mod - 2) % mod;
for(int i = 1; i <= n; i++) {
for(int j = i, s = 1; j <= n; j += i, s++) {
(F[j] += mu[s] * w[i]) %= mod;
} (F[i] += mod) %= mod;
} for(int i = 1; i <= n; i++) {
if(F[i] != 0 && fr[i] == 0) {bk = 1; break;}
q[i] = F[i] * pow_mod(fr[i], mod - 2) % mod;
} if(bk) {puts("-1"); continue;}
for(int i = 1; i <= n; i++) {
for(int j = i, s = 1; j <= n; j += i, s++) {
(t[i] += mu[s] * q[j]) %= mod;
} (t[i] += mod) %= mod;
} for(int i = 1; i <= n; i++) {
if(t[i] != 0 && g[i] == 0) {bk = 1; break;}
x[i] = t[i] * pow_mod(g[i], mod - 2) % mod;
} if(bk) {puts("-1"); continue;}
for(int i = 1; i <= n; i++) put(x[i]), putchar(' ');
putchar('\n');
}
return 0;
}