QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#429532#8715. 放苹果LynkcatAC ✓1197ms35076kbC++205.2kb2024-06-02 16:31:322024-06-02 16:31:33

Judging History

This is the latest submission verdict.

  • [2024-06-02 16:31:33]
  • Judged
  • Verdict: AC
  • Time: 1197ms
  • Memory: 35076kb
  • [2024-06-02 16:31:32]
  • Submitted

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