2 条题解

  • 1
    @ 2026-1-16 22:57:29

    #include <bits/stdc++.h>
    #define N 263000
    #define lg2(x) (31 - __builtin_clz(x))
    typedef long long ll;
    const ll mod = 998244353, root = 31;
    
    int n;
    int a[N], b[N], c[N];
    ll fact[N], finv[N];
    
    ll PowerMod(ll a, int n, ll c = 1) {for (; n; n >>= 1, a = a * a % mod) if (n & 1) c = c * a % mod; return c;}
    
    namespace Poly {
    	ll iv;
    	int l, n;
    	int x[N], y[N], rev[N];
    
    	void NTT_init(int len) {
    		n = 1 << (l = len); iv = PowerMod(n, mod - 2);
    		ll g = PowerMod(root, 1 << 23 - l);
    		x[0] = 1; rev[0] = 0;
    		for (int i = 1; i < n; ++i){
    			x[i] = (ll)x[i - 1] * g % mod;
    			rev[i] = (i & 1 ? rev[i - 1] | 1 << (l - 1) : rev[i >> 1] >> 1);
    		}
    	}
    
    	void DNTT(int *d, int *t) {
    		int i, *j, *k, len = 1, delta = n, R;
    		for (i = 0; i < n; ++i) t[i] = d[rev[i]];
    		for (i = 0; i < l; ++i) {
    			delta >>= 1;
    			for (k = x, j = y; j < y + len; k += delta, ++j) *j = *k;
    			for (j = t; j < t + n; j += len << 1)
    				for (k = j; k < j + len; ++k) {
    					R = (ll)y[k - j] * k[len] % mod;
    					k[len] = (*k - R < 0 ? *k - R + mod : *k - R);
    					*k = (*k + R >= mod ? *k + R - mod : *k + R);
    				}
    			len <<= 1;
    		}
    	}
    
    	void Mul(int *a, int *b, int *c, int deg){
    		int i;
    		NTT_init(lg2(deg) + 1);
    		DNTT(a, c); DNTT(b, a);
    		for(i = 0; i < n; ++i) a[i] = (ll)a[i] * c[i] % mod;
    		DNTT(a, c);
    		std::reverse(c + 1, c + n);
    		for(i = 0; i < n; i++) c[i] = (ll)c[i] * iv % mod;
    	}
    }
    
    int main() {
    	int i; ll r, coe = 1, ans = 0;
    	scanf("%d", &n);
    	for (*fact = i = 1; i <= n; ++i) fact[i] = fact[i - 1] * i % mod;
    	finv[n] = PowerMod(fact[n], mod - 2);
    	for (i = n; i; --i) finv[i - 1] = finv[i] * i % mod;
    	for (i = 0; i <= n; ++i) a[i] = i & 1 ? mod - finv[i] : finv[i];
    	b[0] = 1; b[1] = n + 1;
    	for (i = 2; i <= n; ++i) {
    		r = finv[i] * finv[i - 1] % mod * fact[i - 2] % mod;
    		b[i] = (PowerMod(i, n + 1, r) + mod - r) % mod;
    	}
    	Poly::Mul(a, b, c, n << 1);
    	for (i = 0; i <= n; ++i) {
    		ans = (ans + c[i] * coe) % mod;
    		coe = coe * 2 * (i + 1) % mod;
    	}
    	printf("%lld\n", ans);
    	return 0;
    }
    
    
    • 0
      @ 2026-2-24 10:06:13
      #include<bits/stdc++.h>
      using namespace std;
      #define int long long
      #define fu(i,j,k) for(int i=j;i<=k;i++)
      #define fd(i,j,k) for(int i=j;i>=k;i--)
      const int N=4e5+10,P=998244353;
      int qpow(int a,int b){int ans=1;for(;b;b>>=1,a=a*a%P)if(b&1)ans=ans*a%P;return ans;}
      int a[N],b[N],c[N],fac[N],d2[N];
      void ntt(int s[],int n,int x)
      {
      	if(n==1)return;
      	int s1[n/2],s2[n/2];
      	fu(i,0,n/2-1)s1[i]=s[i*2],s2[i]=s[i*2+1];
      	ntt(s1,n/2,x*x%P),ntt(s2,n/2,x*x%P);
      	for(int i=0,xi=1;i<n/2;i++,xi=xi*x%P)
      	{
      		s[i]=(s1[i]+s2[i]*xi)%P;
      		s[i+(n/2)]=((s1[i]-s2[i]*xi)%P+P)%P;
      	}
      }
      signed main()
      {
      	int n;cin>>n;
      	fac[0]=1;fu(i,1,n)fac[i]=fac[i-1]*i%P;
      	d2[0]=1;fu(i,1,n)d2[i]=d2[i-1]*2%P;
      	fu(i,0,n)a[i]=(((i%2==0)?1:-1)*qpow(fac[i],P-2)%P+P)%P;
      	b[0]=1;b[1]=n+1;fu(i,2,n)b[i]=(qpow(i,n+1)-1)*qpow((i-1)*fac[i]%P,P-2)%P;
      	int D=1;while(D<n*2-1)D<<=1;
      	int inv=qpow(D,P-2),x=qpow(3,(P-1)/D);
      	ntt(a,D,x);ntt(b,D,x);
      	fu(i,0,D-1)c[i]=a[i]*b[i]%P;
      	int inv1=qpow(x,P-2);
      	ntt(c,D,inv1);
      	fu(i,0,n*2-2)c[i]=c[i]*inv%P;
      	int ans=0;
      	fu(i,0,n)ans=(ans+c[i]*fac[i]%P*d2[i]%P)%P;
      	cout<<ans;
      	return 0;
      }
      • 1

      信息

      ID
      6220
      时间
      1000ms
      内存
      256MiB
      难度
      8
      标签
      递交数
      20
      已通过
      7
      上传者