QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#279958#7873. Since A Lightzhouhuanyi51 674ms51056kbC++203.5kb2023-12-09 12:51:082023-12-09 12:51:08

Judging History

你现在查看的是最新测评结果

  • [2023-12-09 12:51:08]
  • 评测
  • 测评结果:51
  • 用时:674ms
  • 内存:51056kb
  • [2023-12-09 12:51:08]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<vector>
#define N 100000
#define M 262144
#define K 20
#define g 3
#define mod 998244353
using namespace std;
int read()
{
	char c=0;
	int sum=0;
	while (c<'0'||c>'9') c=getchar();
	while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
	return sum;
}
int fast_pow(int a,int b)
{
	int res=1,mul=a;
	while (b)
	{
		if (b&1) res=1ll*res*mul%mod;
		mul=1ll*mul*mul%mod,b>>=1;
	}
	return res;
}
void Adder(int &x,int d)
{
	x+=d;
	if (x>=mod) x-=mod;
	return;
}
void Adder2(int &x,int d)
{
	x+=d;
	if (x<0) x+=mod;
	return;
}
int MD(int x)
{
	return x>=mod?x-mod:x;
}
int MD2(int x)
{
	return x<0?x+mod:x;
}
int n,d,ans,length,cl[6][6],A[M+1],B[M+1],wn[K+1][M+1],wn2[K+1][M+1],rev[M+1],num[M+1];
struct matrix
{
	vector<int>p[6][6];
};
matrix e,nw,dres,c,zero;
vector<int>zro;
void NTT(int limit,int *s,int type)
{
	int s1,s2;
	for (int i=1;i<limit;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?(limit>>1):0);
	for (int i=0;i<limit;++i)
		if (rev[i]>i)
			swap(s[i],s[rev[i]]);
	if (type==1)
	{
		for (int i=2;i<=limit;i<<=1)
			for (int j=0;j+i-1<limit;j+=i)
				for (int k=j;k<j+(i>>1);++k)
					s1=s[k],s2=1ll*s[k+(i>>1)]*wn[num[i]][k-j]%mod,s[k]=MD(s1+s2),s[k+(i>>1)]=MD2(s1-s2);
	}
	else
	{
		for (int i=2;i<=limit;i<<=1)
			for (int j=0;j+i-1<limit;j+=i)
				for (int k=j;k<j+(i>>1);++k)
					s1=s[k],s2=1ll*s[k+(i>>1)]*wn2[num[i]][k-j]%mod,s[k]=MD(s1+s2),s[k+(i>>1)]=MD2(s1-s2);
		s1=fast_pow(limit,mod-2);
		for (int i=0;i<limit;++i) s[i]=1ll*s[i]*s1%mod;
	}
	return;
}
vector<int>operator + (vector<int>a,vector<int>b)
{
	if (a.size()<b.size()) swap(a,b);
	for (int i=0;i<b.size();++i) Adder(a[i],b[i]);
	return a;
}
vector<int>operator * (vector<int>a,vector<int>b)
{
	if (a.empty()||b.empty()) return zro;
	int limit=1;
	vector<int>cs(min((int)(a.size()+b.size()-1),d));
	if (min(a.size(),b.size())<=10)
	{
		for (int i=0;i<a.size();++i)
			for (int j=0;j<b.size()&&i+j<cs.size();++j)
				Adder(cs[i+j],1ll*a[i]*b[j]%mod);
		return cs;
	}
	else
	{
		while (limit<=a.size()+b.size()) limit<<=1;
		for (int i=0;i<=limit;++i) A[i]=B[i]=0;
		for (int i=0;i<a.size();++i) A[i]=a[i];
		for (int i=0;i<b.size();++i) B[i]=b[i];
		NTT(limit,A,1),NTT(limit,B,1);
		for (int i=0;i<=limit;++i) A[i]=1ll*A[i]*B[i]%mod;
		NTT(limit,A,-1);
		for (int i=0;i<cs.size();++i) cs[i]=A[i];
	}
	return cs;
}
matrix operator * (matrix a,matrix b)
{
	c=zero;
	for (int k=0;k<6;++k)
		for (int i=0;i<6;++i)
			for (int j=0;j<6;++j)
				c.p[i][j]=c.p[i][j]+a.p[i][k]*b.p[k][j];
	return c;
}
matrix fast_pows(matrix a,int b)
{
	matrix res=e,mul=a;
	while (b)
	{
		if (b&1) res=res*mul;
		mul=mul*mul,b>>=1;
	}
	return res;
}
int main()
{
	int rst;
	for (int i=2;i<=M;i<<=1)
	{
		num[i]=++length,rst=fast_pow(g,(mod-1)/i);
		for (int j=0,res=1;j<(i>>1);++j,res=1ll*res*rst%mod) wn[num[i]][j]=res;
		rst=fast_pow(g,(mod-1)/i*(i-1));
		for (int j=0,res=1;j<(i>>1);++j,res=1ll*res*rst%mod) wn2[num[i]][j]=res;
	}
	for (int i=0;i<6;++i) e.p[i][i]={1};
	n=read(),d=read();
	for (int op=0;op<=1;++op)
		for (int op2=0;op2<=1;++op2)
			for (int op3=0;op3<=1-op;++op3)
				for (int op4=0;op4<=1-op2;++op4)
					nw.p[(op<<1)+op2][(op3<<1)+op4].resize((!op&&!op3)+(!op2&&!op4)+1),nw.p[(op<<1)+op2][(op3<<1)+op4].back()=1;
	nw.p[1][4]=nw.p[4][4]=nw.p[4][5]=nw.p[5][4]={1},dres=fast_pows(nw,n);
	for (int i=0;i<=3;++i)
		if (d-1<dres.p[i][4].size())
			Adder(ans,dres.p[i][4][d-1]);
	printf("%d\n",ans);
	return 0;
}

詳細信息

Subtask #1:

score: 1
Accepted

Test #1:

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

input:

1 1

output:

1

result:

ok single line: '1'

Test #2:

score: 0
Accepted
time: 3ms
memory: 45056kb

input:

2 1

output:

2

result:

ok single line: '2'

Test #3:

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

input:

3 2

output:

3

result:

ok single line: '3'

Test #4:

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

input:

4 4

output:

5

result:

ok single line: '5'

Test #5:

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

input:

5 7

output:

2

result:

ok single line: '2'

Test #6:

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

input:

6 4

output:

41

result:

ok single line: '41'

Test #7:

score: 0
Accepted
time: 5ms
memory: 45132kb

input:

7 11

output:

2

result:

ok single line: '2'

Test #8:

score: 0
Accepted
time: 3ms
memory: 42780kb

input:

8 8

output:

175

result:

ok single line: '175'

Test #9:

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

input:

9 10

output:

298

result:

ok single line: '298'

Test #10:

score: 0
Accepted
time: 3ms
memory: 45124kb

input:

10 3

output:

392

result:

ok single line: '392'

Test #11:

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

input:

11 8

output:

3785

result:

ok single line: '3785'

Test #12:

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

input:

12 15

output:

1422

result:

ok single line: '1422'

Test #13:

score: 0
Accepted
time: 7ms
memory: 49236kb

input:

13 17

output:

2008

result:

ok single line: '2008'

Test #14:

score: 0
Accepted
time: 5ms
memory: 45032kb

input:

14 16

output:

21508

result:

ok single line: '21508'

Test #15:

score: 0
Accepted
time: 3ms
memory: 44760kb

input:

15 1

output:

1596

result:

ok single line: '1596'

Test #16:

score: 0
Accepted
time: 7ms
memory: 49248kb

input:

16 28

output:

29

result:

ok single line: '29'

Test #17:

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

input:

17 6

output:

98086

result:

ok single line: '98086'

Test #18:

score: 0
Accepted
time: 3ms
memory: 44804kb

input:

18 11

output:

1478534

result:

ok single line: '1478534'

Test #19:

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

input:

19 25

output:

250068

result:

ok single line: '250068'

Test #20:

score: 0
Accepted
time: 3ms
memory: 46784kb

input:

20 27

output:

355418

result:

ok single line: '355418'

Test #21:

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

input:

21 23

output:

13517834

result:

ok single line: '13517834'

Test #22:

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

input:

22 4

output:

315460

result:

ok single line: '315460'

Test #23:

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

input:

23 37

output:

18428

result:

ok single line: '18428'

Test #24:

score: 0
Accepted
time: 3ms
memory: 46840kb

input:

24 18

output:

647287901

result:

ok single line: '647287901'

Test #25:

score: 0
Accepted
time: 5ms
memory: 46876kb

input:

25 40

output:

136655

result:

ok single line: '136655'

Subtask #2:

score: 7
Accepted

Test #26:

score: 7
Accepted
time: 6ms
memory: 44808kb

input:

380 59

output:

718355613

result:

ok single line: '718355613'

Test #27:

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

input:

164 46

output:

353450103

result:

ok single line: '353450103'

Test #28:

score: 0
Accepted
time: 8ms
memory: 44884kb

input:

206 144

output:

910367339

result:

ok single line: '910367339'

Test #29:

score: 0
Accepted
time: 7ms
memory: 49244kb

input:

270 127

output:

78796015

result:

ok single line: '78796015'

Test #30:

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

input:

157 87

output:

705420296

result:

ok single line: '705420296'

Subtask #3:

score: 10
Accepted

Test #31:

score: 10
Accepted
time: 18ms
memory: 47184kb

input:

413 652

output:

170600118

result:

ok single line: '170600118'

Test #32:

score: 0
Accepted
time: 36ms
memory: 45108kb

input:

724 979

output:

677376486

result:

ok single line: '677376486'

Test #33:

score: 0
Accepted
time: 70ms
memory: 47676kb

input:

1667 1699

output:

147640784

result:

ok single line: '147640784'

Test #34:

score: 0
Accepted
time: 54ms
memory: 49248kb

input:

1980 517

output:

276583672

result:

ok single line: '276583672'

Test #35:

score: 0
Accepted
time: 75ms
memory: 49864kb

input:

2000 2000

output:

265422351

result:

ok single line: '265422351'

Subtask #4:

score: 14
Accepted

Test #36:

score: 14
Accepted
time: 230ms
memory: 49124kb

input:

4495 4498

output:

375585699

result:

ok single line: '375585699'

Test #37:

score: 0
Accepted
time: 166ms
memory: 50100kb

input:

4968 2196

output:

844161053

result:

ok single line: '844161053'

Test #38:

score: 0
Accepted
time: 160ms
memory: 48716kb

input:

3967 3143

output:

496535114

result:

ok single line: '496535114'

Test #39:

score: 0
Accepted
time: 129ms
memory: 51056kb

input:

2406 4205

output:

599052202

result:

ok single line: '599052202'

Test #40:

score: 0
Accepted
time: 161ms
memory: 48580kb

input:

3942 3259

output:

110001226

result:

ok single line: '110001226'

Subtask #5:

score: 19
Accepted

Test #41:

score: 19
Accepted
time: 15ms
memory: 48832kb

input:

158314621 32

output:

465741961

result:

ok single line: '465741961'

Test #42:

score: 0
Accepted
time: 32ms
memory: 46892kb

input:

456573367 93

output:

310185347

result:

ok single line: '310185347'

Test #43:

score: 0
Accepted
time: 23ms
memory: 48896kb

input:

638787498 62

output:

467767457

result:

ok single line: '467767457'

Test #44:

score: 0
Accepted
time: 19ms
memory: 47116kb

input:

752253598 48

output:

110045639

result:

ok single line: '110045639'

Test #45:

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

input:

992442354 76

output:

330338775

result:

ok single line: '330338775'

Subtask #6:

score: 0
Time Limit Exceeded

Test #46:

score: 36
Accepted
time: 574ms
memory: 47616kb

input:

812922977 1762

output:

927995257

result:

ok single line: '927995257'

Test #47:

score: 0
Accepted
time: 674ms
memory: 47380kb

input:

661518393 1247

output:

469311509

result:

ok single line: '469311509'

Test #48:

score: 0
Accepted
time: 542ms
memory: 49660kb

input:

562238351 1811

output:

157645249

result:

ok single line: '157645249'

Test #49:

score: 0
Accepted
time: 20ms
memory: 49000kb

input:

985149295 62

output:

137919742

result:

ok single line: '137919742'

Test #50:

score: -36
Time Limit Exceeded

input:

983061012 3695

output:


result:


Subtask #7:

score: 0
Time Limit Exceeded

Test #51:

score: 0
Time Limit Exceeded

input:

320076133 78121

output:


result: