QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#891873#10078. FS's Critical Concert致远星 (Penghao Zhai, Qiwen Xu, Xubei Zhong)#AC ✓3424ms131552kbC++233.4kb2025-02-09 18:58:532025-02-09 18:58:57

Judging History

This is the latest submission verdict.

  • [2025-02-09 18:58:57]
  • Judged
  • Verdict: AC
  • Time: 3424ms
  • Memory: 131552kb
  • [2025-02-09 18:58:53]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
namespace Polynomial
{
	using ll=long long;
	using poly=vector<ll>;
	const ll mod=998244353;
	ll ksm(ll a,ll b)
	{
		ll ans=1;
		while(b)
		{
			if(b&1) ans=ans*a%mod;
			b>>=1;
			a=a*a%mod;
		}
		return ans;
	}
	inline int sz(const poly &p)
	{
		return p.size();
	}
	const poly operator +(const poly &a,const poly &b)
	{
		int p=sz(a),q=sz(b);
		int n=max(p,q);
		poly ret(n,0);
		for(int i=0;i<n;i++)
		{
			if(i<p) ret[i]+=a[i];
			if(i<q) ret[i]+=b[i];
			if(ret[i]>=mod) ret[i]-=mod;
		}
		return ret;
	}
	const poly operator -(const poly &a,const poly &b)
	{
		int p=sz(a),q=sz(b);
		int n=max(p,q);
		poly ret(n,0);
		for(int i=0;i<n;i++)
		{
			if(i<p) ret[i]+=a[i];
			if(i<q) ret[i]+=mod-b[i];
			if(ret[i]>=mod) ret[i]-=mod;
		}
		return ret;
	}
	poly operator *(poly a,poly b)
	{
		const ll g=3;
		int len=sz(a)+sz(b);
		int m=1;
		while(m<sz(a)+sz(b)) m*=2;
		a.resize(m);
		b.resize(m);
		vector<int> rev(m);
		for(int i=0;i<m;i++)
			rev[i]=(rev[i>>1]>>1)|((i&1)*(m>>1));
		for(int i=0;i<m;i++)
			if(rev[i]<i)
			{
				swap(a[i],a[rev[i]]);
				swap(b[i],b[rev[i]]);
			}
		for(int i=1;i<m;i<<=1)
		{
			ll gn=ksm(g,(mod-1)/i/2);
			for(int j=0;j<m;j+=(i<<1))
			{
				ll g0=1;
				for(int k=0;k<i;k++,g0=g0*gn%mod)
				{
					{
						ll x=a[j+k],y=g0*a[i+j+k]%mod;
						a[j+k]=(x+y)%mod;
						a[i+j+k]=(x+mod-y)%mod;
					}
					{
						ll x=b[j+k],y=g0*b[i+j+k]%mod;
						b[j+k]=(x+y)%mod;
						b[i+j+k]=(x+mod-y)%mod;
					}
				}
			}
		}
		for(int i=0;i<m;i++)
			a[i]=a[i]*b[i]%mod;
		for(int i=0;i<m;i++)
			if(rev[i]<i)
				swap(a[i],a[rev[i]]);
		for(int i=1;i<m;i<<=1)
		{
			ll gn=ksm(g,(mod-1)/i/2*(mod-2));
			for(int j=0;j<m;j+=(i<<1))
			{
				ll g0=1;
				for(int k=0;k<i;k++,g0=g0*gn%mod)
				{
					ll x=a[j+k],y=g0*a[i+j+k]%mod;
					a[j+k]=(x+y)%mod;
					a[i+j+k]=(x+mod-y)%mod;
				}
			}
		}
		ll val=ksm(m,mod-2);
		for(int i=0;i<m;i++)
			a[i]=a[i]*val%mod;
		a.resize(len-1);
		return a;
	}
	poly inv(poly p,int deg)
	{
		p.resize(deg);
		if(deg==1) return {ksm(p[0],mod-2)};
		poly w=inv(p,(deg+1)/2);
		poly g=w+w-p*w*w;
		g.resize(deg);
		return g;
	}
	poly deriv(poly p)
	{
		for(int i=0;i<sz(p);i++)
			p[i]=p[i]*i%mod;
		p.erase(p.begin());
		return p;
	}
	poly integ(poly p)
	{
		p.insert(p.begin(),0);
		for(int i=0;i<sz(p);i++)
			p[i]=p[i]*ksm(i,mod-2)%mod;
		return p;
	}
	poly ln(poly p)
	{
		return integ(deriv(p)*inv(p,sz(p)));
	}
	poly exp(poly p,int deg)
	{
		p.resize(deg);
		if(deg==1)
			return {1};
		poly g=exp(p,(deg+1)/2);
		g=g*(poly{1}-ln(g)+p);
		g.resize(deg);
		return g;
	}
}
using namespace Polynomial;
ll fact[1000500],rfact[1000500];
ll val[1000500];
int main()
{
	int n;
	cin>>n;
	n*=2;
	fact[0]=1;
	for(int i=1;i<=n;i++)
		fact[i]=fact[i-1]*i%mod;
	for(int i=0;i<=n;i++) rfact[i]=ksm(fact[i],mod-2);
	poly f(n+1);
	for(int i=0;i<=n;i++)
		f[i]=ksm(2,1ll*i*(i-1)/2)*ksm(fact[i],mod-2)%mod;
	f=ln(f);
	for(int i=1;i<=n;i++)
		val[i]=f[i]*fact[i]%mod;
	poly A(n+1);
	for(int i=1;i<=n;i++)
		A[i]=val[i]*i%mod*rfact[i]%mod;
	A=A*A;
	ll ans=0;
	n/=2;
	for(int i=1;i<=n;i++)
	{
		ll C=fact[n]*rfact[i]%mod*rfact[n-i]%mod;
		C=C*ksm(2,1ll*(n-i)*(n-i-1)/2)%mod;
		ans=(ans+A[i]*fact[i]%mod*C)%mod;
	}
	cout<<ans*ksm(2,mod-2)%mod<<'\n';
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 7756kb

input:

3

output:

9

result:

ok 1 number(s): "9"

Test #2:

score: 0
Accepted
time: 0ms
memory: 7708kb

input:

8

output:

130981312

result:

ok 1 number(s): "130981312"

Test #3:

score: 0
Accepted
time: 1ms
memory: 7760kb

input:

1

output:

0

result:

ok 1 number(s): "0"

Test #4:

score: 0
Accepted
time: 0ms
memory: 7756kb

input:

2

output:

1

result:

ok 1 number(s): "1"

Test #5:

score: 0
Accepted
time: 0ms
memory: 7752kb

input:

4

output:

96

result:

ok 1 number(s): "96"

Test #6:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

5

output:

1500

result:

ok 1 number(s): "1500"

Test #7:

score: 0
Accepted
time: 0ms
memory: 7756kb

input:

6

output:

37560

result:

ok 1 number(s): "37560"

Test #8:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

7

output:

1626912

result:

ok 1 number(s): "1626912"

Test #9:

score: 0
Accepted
time: 1ms
memory: 7880kb

input:

9

output:

591945260

result:

ok 1 number(s): "591945260"

Test #10:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

10

output:

877137661

result:

ok 1 number(s): "877137661"

Test #11:

score: 0
Accepted
time: 0ms
memory: 7880kb

input:

11

output:

654711510

result:

ok 1 number(s): "654711510"

Test #12:

score: 0
Accepted
time: 0ms
memory: 7752kb

input:

12

output:

896890421

result:

ok 1 number(s): "896890421"

Test #13:

score: 0
Accepted
time: 0ms
memory: 7756kb

input:

13

output:

544152239

result:

ok 1 number(s): "544152239"

Test #14:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

14

output:

203161729

result:

ok 1 number(s): "203161729"

Test #15:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

15

output:

686403302

result:

ok 1 number(s): "686403302"

Test #16:

score: 0
Accepted
time: 0ms
memory: 7756kb

input:

16

output:

551788068

result:

ok 1 number(s): "551788068"

Test #17:

score: 0
Accepted
time: 1ms
memory: 7756kb

input:

17

output:

778761614

result:

ok 1 number(s): "778761614"

Test #18:

score: 0
Accepted
time: 1ms
memory: 7760kb

input:

18

output:

372704747

result:

ok 1 number(s): "372704747"

Test #19:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

19

output:

48091879

result:

ok 1 number(s): "48091879"

Test #20:

score: 0
Accepted
time: 1ms
memory: 7752kb

input:

20

output:

811962966

result:

ok 1 number(s): "811962966"

Test #21:

score: 0
Accepted
time: 0ms
memory: 7708kb

input:

21

output:

580925653

result:

ok 1 number(s): "580925653"

Test #22:

score: 0
Accepted
time: 0ms
memory: 7752kb

input:

22

output:

473369147

result:

ok 1 number(s): "473369147"

Test #23:

score: 0
Accepted
time: 0ms
memory: 7756kb

input:

23

output:

370850086

result:

ok 1 number(s): "370850086"

Test #24:

score: 0
Accepted
time: 0ms
memory: 7756kb

input:

24

output:

633052748

result:

ok 1 number(s): "633052748"

Test #25:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

25

output:

760181773

result:

ok 1 number(s): "760181773"

Test #26:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

26

output:

618049730

result:

ok 1 number(s): "618049730"

Test #27:

score: 0
Accepted
time: 0ms
memory: 7752kb

input:

27

output:

197289938

result:

ok 1 number(s): "197289938"

Test #28:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

28

output:

708240707

result:

ok 1 number(s): "708240707"

Test #29:

score: 0
Accepted
time: 0ms
memory: 7720kb

input:

29

output:

726463024

result:

ok 1 number(s): "726463024"

Test #30:

score: 0
Accepted
time: 0ms
memory: 7756kb

input:

30

output:

587550457

result:

ok 1 number(s): "587550457"

Test #31:

score: 0
Accepted
time: 0ms
memory: 7760kb

input:

100

output:

721970458

result:

ok 1 number(s): "721970458"

Test #32:

score: 0
Accepted
time: 10ms
memory: 8136kb

input:

2562

output:

947609016

result:

ok 1 number(s): "947609016"

Test #33:

score: 0
Accepted
time: 13ms
memory: 8392kb

input:

3410

output:

462244613

result:

ok 1 number(s): "462244613"

Test #34:

score: 0
Accepted
time: 29ms
memory: 9176kb

input:

5712

output:

225049703

result:

ok 1 number(s): "225049703"

Test #35:

score: 0
Accepted
time: 49ms
memory: 10128kb

input:

10002

output:

577290168

result:

ok 1 number(s): "577290168"

Test #36:

score: 0
Accepted
time: 301ms
memory: 24188kb

input:

50012

output:

513616100

result:

ok 1 number(s): "513616100"

Test #37:

score: 0
Accepted
time: 508ms
memory: 27952kb

input:

75162

output:

197336463

result:

ok 1 number(s): "197336463"

Test #38:

score: 0
Accepted
time: 728ms
memory: 38128kb

input:

129257

output:

307374532

result:

ok 1 number(s): "307374532"

Test #39:

score: 0
Accepted
time: 1514ms
memory: 61596kb

input:

202572

output:

342782823

result:

ok 1 number(s): "342782823"

Test #40:

score: 0
Accepted
time: 2465ms
memory: 104756kb

input:

348252

output:

992752188

result:

ok 1 number(s): "992752188"

Test #41:

score: 0
Accepted
time: 3410ms
memory: 126024kb

input:

452632

output:

374752381

result:

ok 1 number(s): "374752381"

Test #42:

score: 0
Accepted
time: 3424ms
memory: 131552kb

input:

500000

output:

553811795

result:

ok 1 number(s): "553811795"