QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#429532 | #8715. 放苹果 | Lynkcat | AC ✓ | 1197ms | 35076kb | C++20 | 5.2kb | 2024-06-02 16:31:32 | 2024-06-02 16:31:33 |
Judging History
answer
#include <bits/stdc++.h>
#define V vector
#define Vi vector<int>
#define sz(a) ((int)a.size())
#define fi first
#define se second
#define Int pair<int, int>
#define Inf ((int)1e9)
#define pb push_back
#define ins insert
#define For(i, x, y) for (auto i = (x); i <= (y); i++)
#define Rep(i, x, y) for (auto i = (x); i >= (y); i--)
#define all(a) a.begin(), a.end()
#define IO(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
using namespace std;
#define ll long long
const int P = 998244353;
struct mint {
int d;
mint() = default;
mint(int x) : d(x < 0 ? x + P : x) {}
mint(ll x) : d(int(x % P)) {}
explicit operator int() { return d; }
friend istream &operator>>(istream &x, mint &y) { return x >> y.d; }
friend ostream &operator<<(ostream &x, mint y) { return x << y.d; }
friend mint operator+(mint x, mint y) {
return (x.d += y.d) < P ? x.d : x.d - P;
}
mint &operator+=(mint z) { return (d += z.d) < P ? d : d -= P, *this; }
friend mint operator-(mint x, mint y) {
return (x.d -= y.d) < 0 ? x.d + P : x.d;
}
mint &operator-=(mint z) { return (d -= z.d) < 0 ? d += P : d, *this; }
friend mint operator*(mint x, mint y) { return int(1ll * x.d * y.d % P); }
mint &operator*=(mint z) { return d = int(1ll * d * z.d % P), *this; }
static mint qpow(int x, ll y = P - 2) {
int z = 1;
for (; y; y >>= 1, x = int(1ll * x * x % P))
if (y & 1) z = int(1ll * x * z % P);
return z;
}
friend mint operator/(mint x, mint y) { return x *= qpow(y.d); }
mint &operator/=(mint z) { return (*this) *= qpow(z.d); }
mint inv() { return qpow(d); }
mint pow(mint z) { return qpow(d, z.d); }
mint pow(int z) { return z >= 0 ? qpow(d, z) : 1 / qpow(d, -z); }
mint operator+() { return d; }
mint operator-() { return P - d; }
};
mint operator""_m(unsigned ll x) { return mint(int(x)); }
struct poly : vector<mint> {
poly() = default;
poly(int x) { resize(x); }
poly(const initializer_list<mint> &s) : std::vector<mint>(s) {}
friend void NTT(poly &A, int T) {
int S = A.size();
Vi cnt(S);
for (int i = 0; i < S; i++) {
cnt[i] = (cnt[i >> 1] >> 1) + (i & 1) * S / 2;
if (i < cnt[i]) std::swap(A[i], A[cnt[i]]);
}
mint G = 3, Gi = G.inv();
for (int len = 1; len < S; len *= 2) {
mint W = (T ? G : Gi).pow((P - 1) / len / 2);
V<mint> pw(len, 1);
For(i, 1, len - 1) pw[i] = pw[i - 1] * W;
for (int L = 0; L < S; L += len * 2) For(k, 0, len - 1) {
mint x = A[L + k], y = A[L + len + k] * pw[k];
A[L + k] = x + y, A[L + len + k] = x - y;
}
}
}
friend poly operator*(poly a, poly b) {
int n = sz(a) - 1, m = sz(b) - 1, S;
for (S = 2; S <= n + m; S *= 2)
;
poly A(S), B(S);
for (int i = 0; i <= n; i++) A[i] = a[i];
for (int i = 0; i <= m; i++) B[i] = b[i];
NTT(A, 1), NTT(B, 1);
for (int i = 0; i < S; i++) A[i] *= B[i];
NTT(A, 0);
mint Inv = 1_m / S;
B.resize(n + m + 1);
for (int i = 0; i <= n + m; i++) B[i] = Inv * A[i];
return B;
}
friend poly operator+(poly a, poly b) {
if (sz(a) < sz(b)) std::swap(a, b);
for (int i = 0; i < sz(b); i++) a[i] += b[i];
return a;
}
template <typename T>
poly(T a, T b) : std::vector<mint>(a, b) {}
friend poly Inv(poly &A, int m) {
poly T(&A[0], &A[min(sz(A), m)]), X = {A[0].inv()};
while (sz(X) < m) {
poly temp(T.begin(), T.begin() + min(sz(T), 2 * sz(X))),
nx = X * X * temp;
X.resize(2 * sz(X));
for (int i = 0; i < sz(X); i++) X[i] = 2 * X[i] - nx[i];
}
X.resize(m);
return X;
}
};
const int N = 3e5 + 5;
poly jie(N, 1), ni(N), B(N);
poly pw(N);
int n,m;
void pre(int n) {
pw[0]=1;
for (int i=1;i<=n;i++) pw[i]=pw[i-1]*m;
For(i, 1, n) jie[i] = jie[i - 1] * i;
ni[n] = jie[n].inv();
Rep(i, n, 1) ni[i - 1] = ni[i] * i;
poly tmp({&ni[1], &ni[n + 1]});
B = Inv(tmp, n - 1);
for (int i=0;i<sz(B);i++) B[i]*=jie[i];
}
inline mint C(int x,int y)
{
if (x<y||y<0) return mint(0);
return jie[x] * ni[y] * ni[x-y];
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n>>m;
pre(N-1);
poly a(n+1,0);
poly x(n+1,0),y(n+1,0);
for (int i=1;i<n;i++)
{
mint coef=C(n,i)*min(i,n-i);
coef=coef*jie[n-i];
y[i]=coef;
}
for (int i=0;i<=n;i++)
{
x[i]=ni[i];
if (i%2==1) x[i]=P-x[i];
}
x=x*y;
for (int i=0;i<=n;i++)
{
a[i]=x[i]*ni[n-i];
a[i]=a[i]*mint(m).pow(n-i);
}
// for (int i=0;i<=n;i++) cout<<B[i]<<",";
// cout<<endl;
// for (int i=0;i<=n;i++) cout<<a[i]<<",";
// cout<<endl;
//
// for (int i=0;i<=n;i++) a[i]=0;
// a[3]=1;
// for (int i=0;i<=n;i++) cout<<a[i]<<",";
// cout<<endl;
for (int i=0;i<sz(a);i++)
a[i]/=(i+1),a[i]*=jie[i+1];
// for (int i=0;i<=n;i++) cout<<a[i]<<",";
// cout<<endl;
poly b(n+1,0);
for (int i=0;i<=n;i++)
b[i]=B[n-i],b[i]*=ni[n-i];
// for (int i=0;i<=n;i++) cout<<b[i]<<",";
// cout<<endl;
// cout<<ni[n]*B[n]<<"???"<<" "<<B[2]<<endl;
poly res=a*b;
//[-n...]
mint ans=0;
for (int i=n;i<sz(res);i++)
{
int ri=i-n+1;
res[i]*=ni[ri];
ans=(ans+res[i]*(mint(m).pow(ri)));
}
cout<<ans<<'\n';
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 848ms
memory: 34948kb
input:
2 3
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 845ms
memory: 34940kb
input:
3 3
output:
36
result:
ok 1 number(s): "36"
Test #3:
score: 0
Accepted
time: 841ms
memory: 34992kb
input:
1 1
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 855ms
memory: 34928kb
input:
1 2
output:
0
result:
ok 1 number(s): "0"
Test #5:
score: 0
Accepted
time: 849ms
memory: 34924kb
input:
1 3
output:
0
result:
ok 1 number(s): "0"
Test #6:
score: 0
Accepted
time: 857ms
memory: 34976kb
input:
2 1
output:
0
result:
ok 1 number(s): "0"
Test #7:
score: 0
Accepted
time: 845ms
memory: 34920kb
input:
3 1
output:
0
result:
ok 1 number(s): "0"
Test #8:
score: 0
Accepted
time: 851ms
memory: 35008kb
input:
3719 101
output:
78994090
result:
ok 1 number(s): "78994090"
Test #9:
score: 0
Accepted
time: 858ms
memory: 34936kb
input:
2189 1022
output:
149789741
result:
ok 1 number(s): "149789741"
Test #10:
score: 0
Accepted
time: 860ms
memory: 34920kb
input:
2910 382012013
output:
926541722
result:
ok 1 number(s): "926541722"
Test #11:
score: 0
Accepted
time: 1152ms
memory: 34972kb
input:
131072 3837829
output:
487765455
result:
ok 1 number(s): "487765455"
Test #12:
score: 0
Accepted
time: 1191ms
memory: 34936kb
input:
183092 100000000
output:
231786691
result:
ok 1 number(s): "231786691"
Test #13:
score: 0
Accepted
time: 1197ms
memory: 34980kb
input:
197291 937201572
output:
337054675
result:
ok 1 number(s): "337054675"
Test #14:
score: 0
Accepted
time: 1192ms
memory: 34940kb
input:
200000 328194672
output:
420979346
result:
ok 1 number(s): "420979346"
Test #15:
score: 0
Accepted
time: 1182ms
memory: 35076kb
input:
200000 1000000000
output:
961552572
result:
ok 1 number(s): "961552572"
Extra Test:
score: 0
Extra Test Passed