QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#896938#10078. FS's Critical ConcertliuhengxiAC ✓645ms70696kbC++143.7kb2025-02-13 16:15:502025-02-13 16:15:51

Judging History

This is the latest submission verdict.

  • [2025-02-13 16:15:51]
  • Judged
  • Verdict: AC
  • Time: 645ms
  • Memory: 70696kb
  • [2025-02-13 16:15:50]
  • Submitted

answer

// created:  2025-02-13 15:48:08
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<vector>
#define F(i,l,r) for(int i=(l),i##_end=(r);i<i##_end;++i)
#define I128 //||is_same<T,__int128_t>::value||is_same<T,__uint128_t>::value
using namespace std;
template<typename T>enable_if_t<is_integral<T>::value I128,void> readmain(T &x)
{
	bool neg=false;int c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')neg=true;
	for(x=0;isdigit(c);c=getchar())x=(T)(10*x+(c-'0'));
	if(neg)x=-x;
}
template<typename T>T& read(T &x){readmain(x);return x;}
template<typename T,typename ...Tr>void read(T &x,Tr&... r){readmain(x);read(r...);}
typedef unsigned long long ull;
constexpr int N=(1<<21)+5,MOD=998244353,inv2=(MOD+1)>>1;
void reduce(int &x){if(x>=MOD)x-=MOD;}
int qpow(ull a,int b,ull c=1)
{
	for(;b;b>>=1,(a*=a)%=MOD)if(b&1)(c*=a)%=MOD;
	return (int)c;
}
namespace conv
{
	int r[N],g[N];
	ull a[N];
	void ntt(int *b,int n,bool inv)
	{
		int m=31^__builtin_clz(n);
		F(i,0,n)r[i]=r[i>>1]>>1|(i&1)<<(m-1),a[i]=b[r[i]];
		F(i,0,m)
		{
			int h=1<<i,s=2<<i,g_=qpow(3,(MOD-1)>>(i+1));
			F(j,g[0]=1,h)g[j]=(int)((ull)g[j-1]*g_%MOD);
			for(int l=0;l<n;l+=s)
			{
				ull *u=a+l,*v=a+l+h,x;
				for(int k=0;k<h;++k,++u,++v)
				{
					x=*v*g[k]%MOD;
					*v=*u+MOD-x;
					*u+=x;
				}
			}
			if(i==14)F(j,0,h)a[j]%=MOD;
		}
		if(inv)
		{
			ull invn=MOD-((MOD-1)>>m);
			reverse(a+1,a+n);
			F(i,0,n)a[i]*=invn;
		}
		F(i,0,n)b[i]=(int)(a[i]%MOD);
	}
	int getn(int n){return 1<<(32-__builtin_clz((n-1)|1));}
	void ntt(vector<int> &x,int n,bool inv)
	{
		x.resize(n);
		ntt(x.data(),n,inv);
	}
	vector<int> conv(vector<int> x,vector<int> y)
	{
		static int c[N],d[N];
		int n=1<<(32-__builtin_clz(((int)(x.size()+y.size()-2)|1)));
		memset(c,0,sizeof(int)*n);
		memset(d,0,sizeof(int)*n);
		memcpy(c,x.data(),sizeof(int)*x.size());
		memcpy(d,y.data(),sizeof(int)*y.size());
		if(n<=32)
		{
			static ull e[32];
			F(i,0,n)e[i]=0;
			F(i,0,(int)x.size())F(j,0,(int)y.size())e[i+j]+=(ull)c[i]*d[j];
			F(i,0,n)c[i]=(int)(e[i]%MOD);
		}
		else
		{
			ntt(c,n,false);
			ntt(d,n,false);
			F(i,0,n)c[i]=(int)((ull)c[i]*d[i]%MOD);
			ntt(c,n,true);
		}
		return vector<int>(c,c+x.size()+y.size()-1);
	}
}
int fac[N],invfac[N];
vector<int> inv(vector<int> a)
{
	int n=(int)a.size();
	if(n==1)return vector<int>{qpow(a[0],MOD-2)};
	int m=(n+1)>>1;
	vector<int> b=inv(vector<int>(a.begin(),a.begin()+m));
	int s=conv::getn(n+2*m-2);
	conv::ntt(a,s,false);
	conv::ntt(b,s,false);
	F(i,0,s)b[i]=(int)((ull)b[i]*(2+(ull)(MOD-a[i])*b[i]%MOD)%MOD);
	conv::ntt(b,s,true);
	b.resize(n);
	return b;
}
vector<int> deriv(const vector<int> &a)
{
	int n=(int)a.size();
	vector<int> b(n-1);
	F(i,1,n)b[i-1]=(int)((ull)i*a[i]%MOD);
	return b;
}
vector<int> integ(const vector<int> &a)
{
	int n=(int)a.size()+1;
	vector<int> b(n);
	F(i,1,n)b[i]=(int)((ull)a[i-1]*invfac[i]%MOD*fac[i-1]%MOD);
	return b;
}
vector<int> log(const vector<int> &a)
{
	vector<int> b=conv::conv(deriv(a),inv(a));
	b.resize(a.size()-1);
	return integ(b);
}
int n,f[N],g[N];
int main()
{
	read(n);
	F(i,fac[0]=1,n+1)fac[i]=(int)((ull)fac[i-1]*i%MOD);
	invfac[n]=qpow(fac[n],MOD-2);
	for(int i=n;i;--i)invfac[i-1]=(int)((ull)invfac[i]*i%MOD);
	int p2=1;
	F(i,f[0]=1,n+1)
	{
		f[i]=(int)((ull)f[i-1]*p2%MOD);
		reduce(p2<<=1);
	}
	F(i,1,n+1)f[i]=(int)((ull)f[i]*invfac[i]%MOD);
	memcpy(g,log(vector<int>(f,f+n+1)).data(),sizeof(int)*(n+1));
	int s=conv::getn(3*n+1);
	F(i,1,n+1)g[i]=(int)((ull)g[i]*i%MOD);
	conv::ntt(f,s,false);
	conv::ntt(g,s,false);
	F(i,0,s)f[i]=(int)((ull)f[i]*g[i]%MOD*g[i]%MOD);
	conv::ntt(f,s,true);
	int ans=(int)((ull)fac[n]*f[n]%MOD*inv2%MOD);
	printf("%d\n",ans);
	return 0;
}

詳細信息

Test #1:

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

input:

3

output:

9

result:

ok 1 number(s): "9"

Test #2:

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

input:

8

output:

130981312

result:

ok 1 number(s): "130981312"

Test #3:

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

input:

1

output:

0

result:

ok 1 number(s): "0"

Test #4:

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

input:

2

output:

1

result:

ok 1 number(s): "1"

Test #5:

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

input:

4

output:

96

result:

ok 1 number(s): "96"

Test #6:

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

input:

5

output:

1500

result:

ok 1 number(s): "1500"

Test #7:

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

input:

6

output:

37560

result:

ok 1 number(s): "37560"

Test #8:

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

input:

7

output:

1626912

result:

ok 1 number(s): "1626912"

Test #9:

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

input:

9

output:

591945260

result:

ok 1 number(s): "591945260"

Test #10:

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

input:

10

output:

877137661

result:

ok 1 number(s): "877137661"

Test #11:

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

input:

11

output:

654711510

result:

ok 1 number(s): "654711510"

Test #12:

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

input:

12

output:

896890421

result:

ok 1 number(s): "896890421"

Test #13:

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

input:

13

output:

544152239

result:

ok 1 number(s): "544152239"

Test #14:

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

input:

14

output:

203161729

result:

ok 1 number(s): "203161729"

Test #15:

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

input:

15

output:

686403302

result:

ok 1 number(s): "686403302"

Test #16:

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

input:

16

output:

551788068

result:

ok 1 number(s): "551788068"

Test #17:

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

input:

17

output:

778761614

result:

ok 1 number(s): "778761614"

Test #18:

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

input:

18

output:

372704747

result:

ok 1 number(s): "372704747"

Test #19:

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

input:

19

output:

48091879

result:

ok 1 number(s): "48091879"

Test #20:

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

input:

20

output:

811962966

result:

ok 1 number(s): "811962966"

Test #21:

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

input:

21

output:

580925653

result:

ok 1 number(s): "580925653"

Test #22:

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

input:

22

output:

473369147

result:

ok 1 number(s): "473369147"

Test #23:

score: 0
Accepted
time: 2ms
memory: 18128kb

input:

23

output:

370850086

result:

ok 1 number(s): "370850086"

Test #24:

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

input:

24

output:

633052748

result:

ok 1 number(s): "633052748"

Test #25:

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

input:

25

output:

760181773

result:

ok 1 number(s): "760181773"

Test #26:

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

input:

26

output:

618049730

result:

ok 1 number(s): "618049730"

Test #27:

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

input:

27

output:

197289938

result:

ok 1 number(s): "197289938"

Test #28:

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

input:

28

output:

708240707

result:

ok 1 number(s): "708240707"

Test #29:

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

input:

29

output:

726463024

result:

ok 1 number(s): "726463024"

Test #30:

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

input:

30

output:

587550457

result:

ok 1 number(s): "587550457"

Test #31:

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

input:

100

output:

721970458

result:

ok 1 number(s): "721970458"

Test #32:

score: 0
Accepted
time: 2ms
memory: 18404kb

input:

2562

output:

947609016

result:

ok 1 number(s): "947609016"

Test #33:

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

input:

3410

output:

462244613

result:

ok 1 number(s): "462244613"

Test #34:

score: 0
Accepted
time: 4ms
memory: 18476kb

input:

5712

output:

225049703

result:

ok 1 number(s): "225049703"

Test #35:

score: 0
Accepted
time: 6ms
memory: 18496kb

input:

10002

output:

577290168

result:

ok 1 number(s): "577290168"

Test #36:

score: 0
Accepted
time: 40ms
memory: 22588kb

input:

50012

output:

513616100

result:

ok 1 number(s): "513616100"

Test #37:

score: 0
Accepted
time: 72ms
memory: 23996kb

input:

75162

output:

197336463

result:

ok 1 number(s): "197336463"

Test #38:

score: 0
Accepted
time: 101ms
memory: 35224kb

input:

129257

output:

307374532

result:

ok 1 number(s): "307374532"

Test #39:

score: 0
Accepted
time: 253ms
memory: 49756kb

input:

202572

output:

342782823

result:

ok 1 number(s): "342782823"

Test #40:

score: 0
Accepted
time: 425ms
memory: 61140kb

input:

348252

output:

992752188

result:

ok 1 number(s): "992752188"

Test #41:

score: 0
Accepted
time: 595ms
memory: 70088kb

input:

452632

output:

374752381

result:

ok 1 number(s): "374752381"

Test #42:

score: 0
Accepted
time: 645ms
memory: 70696kb

input:

500000

output:

553811795

result:

ok 1 number(s): "553811795"