QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#155711#6410. Classical DP ProblemForever_Young#WA 1294ms132440kbC++143.8kb2023-09-02 01:24:182023-09-02 01:24:19

Judging History

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

  • [2023-09-02 01:24:19]
  • 评测
  • 测评结果:WA
  • 用时:1294ms
  • 内存:132440kb
  • [2023-09-02 01:24:18]
  • 提交

answer

#include<bits/stdc++.h>
#define rep(i,s,t) for(int i = s;i <= t;i ++)
using namespace std;
int n,a[5050],r,dp[5050][5050],res,fac[5050],ifac[5050],g[5050][5050],nt[10100],ant[10100];
const int mod=998244353;
const int NN=5050;
typedef long long ll;

int qpow(int x,int y){
	//printf("%d %d\n",x,y);
	int res=1;
	while (y){
		if (y&1) res=1ll*res*x%mod;
		x=1ll*x*x%mod;
		y/=2;
	}
	return res;
}

//NTT
namespace NTT{
	const int g=3;


	int x[NN<<2],y[NN<<2],wn[NN<<2];
	void init()
	{
		rep(i,0,20)wn[i]=qpow(g,(mod-1)/(1<<i));
	}

	void brc(int *F,int len)
	{
		int j=len/2;
		rep(i,1,len-2){
			if(i<j)swap(F[i],F[j]);
			int k=len/2;
			while(j>=k) j-=k,k>>=1;
			if(j<k)j+=k;
		}
	}

	void NTT(int *F,int len,int t)
	{
		int id=0; brc(F,len);
		for(int h=2;h<=len;h<<=1)
		{
			id++;
			for(int j=0;j<len;j+=h)
			{
				int E=1;
				for(int k=j;k<j+h/2;k++)
				{
					int u=F[k],v=(ll)E*F[k+h/2]%mod;
					F[k]=(u+v)%mod,F[k+h/2]=((u-v)%mod+mod)%mod;
					E=(ll)E*wn[id]%mod;
				}
			}
		}
		if(t==-1)
		{
			rep(i,1,len/2-1)swap(F[i],F[len-i]);
			ll inv=qpow(len,mod-2);
			rep(i,0,len-1)F[i]=(ll)F[i]%mod*inv%mod;
		}
	}
	void multiply(int *a,int len1,int *b,int len2)
	{
		int len=1;
		while(len<len1+len2)len<<=1;
		rep(i,len1,len-1)a[i]=0;
		rep(i,len2,len-1)b[i]=0;
		NTT(a,len,1); NTT(b,len,1);
		rep(i,0,len-1)a[i]=(ll)a[i]*b[i]%mod;
		NTT(a,len,-1);
	}
	void mpow(int *a,int len1,int *b,int len2,int y)
	{
		int len=1;
		while(len<len1+len2)len<<=1;
		rep(i,len1,len-1)a[i]=0;
		rep(i,len2,len-1)b[i]=0;
		while(y) {
			if(y % 2 == 1) {
				NTT(a, len, 1);
				NTT(b, len, 1);
				rep(i, 0, len - 1) a[i] = (ll)a[i] * b[i] % mod;
				NTT(a, len, -1);
				rep(i, len1, len - 1) a[i] = 0;
				NTT(b, len, -1);
			}
			NTT(b, len, 1);
			rep(i, 0, len - 1) b[i] = (ll)b[i] * b[i] % mod;
			NTT(b, len, -1);
			rep(i, len1, len - 1) b[i] = 0;
			y /= 2;
		}
	}
}

int c(int x,int y){//x>=y
	if (x<y) return 0;
	return 1ll*fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}

int main(){
	//freopen("D.in","r",stdin);
	NTT::init();
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int i=n;i;i--){
		if (r>=a[i]) break;
		r++;
	}

	dp[n][a[n-r]]=1;
	for (int i=n;i>n-r;i--)
		for (int j=0;j<=a[n-r];j++){
			//printf("%d %d %d\n",i,j,dp[0][i][j]);
			dp[i-1][j]=(dp[i-1][j]+1ll*dp[i][j]*(a[i]-j))%mod;
			if (j)
				dp[i-1][j-1]=(dp[i-1][j-1]+1ll*dp[i][j]*j)%mod;
		}
	res=dp[n-r][0];
	memset(dp,0,sizeof(dp));
	//printf("%d\n",res);

	dp[n][a[n-r+1]]=1;
	for (int i=n;i>n-r;i--)
		for (int j=0;j<=a[n-r+1];j++){
			//printf("%d %d %d\n",i,j,dp[0][i][j]);
			dp[i-1][j]=(dp[i-1][j]+1ll*dp[i][j]*(a[i]-j))%mod;
			if (j)
				dp[i-1][j-1]=(dp[i-1][j-1]+1ll*dp[i][j]*j)%mod;
		}
	res=(res-dp[n-r][0]+mod)%mod;
	memset(dp,0,sizeof(dp));
	//printf("%d\n",res);

	if (r==a[n-r+1]){
		fac[0]=1;
		for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;
		ifac[n]=qpow(fac[n],mod-2);
		for (int i=n;i;i--) ifac[i-1]=1ll*ifac[i]*i%mod;
		g[1][0]=1;
		int i=1;
		while (i<=n){
			int z=min(a[i],r);
			for (int j=0;j<=z;j++){
				nt[j]=1ll*g[i][j]*fac[z-j]%mod;
				ant[j]=ifac[j];
			}
			int tmp=i;
			while (a[tmp]==a[i]) tmp++;
			if (a[i]>r){
				ant[0]=0;
				tmp=n+1;
			}
			NTT::mpow(nt,z+1,ant,z+1,tmp-i);
			for (int j=0;j<=z;j++) g[tmp][j]=1ll*nt[j]*ifac[z-j]%mod;
			i=tmp;
			//for (int j=0;j<=z;j++) printf("%d %d %d\n",i,j,g[i][j]);

			/*
			   if (a[i]<=r){
			   for (int j=0;j<=r;j++) g[i+1][j]=(g[i+1][j]+g[i][j])%mod;
			   }
			   for (int j=0;j<r;j++){
			   if (g[i][j]==0) continue;
			   for (int k=j+1;k<=r&&k<=a[i];k++){
			   g[i+1][k]=(g[i+1][k]+1ll*g[i][j]*c(min(a[i],r)-j,k-j))%mod;
			   }
			   }
			   */
		}
		//printf("%d\n",g[n+1][r]);
		res=(res+g[n+1][r])%mod;
	}
	printf("%d %d\n",r,res);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 12ms
memory: 105516kb

input:

3
1 2 3

output:

2 6

result:

ok 2 number(s): "2 6"

Test #2:

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

input:

1
1

output:

1 1

result:

ok 2 number(s): "1 1"

Test #3:

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

input:

2
1 1

output:

1 2

result:

ok 2 number(s): "1 2"

Test #4:

score: 0
Accepted
time: 14ms
memory: 107036kb

input:

2
2 2

output:

2 6

result:

ok 2 number(s): "2 6"

Test #5:

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

input:

3
1 1 1

output:

1 3

result:

ok 2 number(s): "1 3"

Test #6:

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

input:

3
2 2 2

output:

2 9

result:

ok 2 number(s): "2 9"

Test #7:

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

input:

3
3 3 3

output:

3 48

result:

ok 2 number(s): "3 48"

Test #8:

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

input:

5
1 1 3 3 4

output:

3 47

result:

ok 2 number(s): "3 47"

Test #9:

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

input:

10
2 4 5 5 5 5 6 8 8 10

output:

5 864

result:

ok 2 number(s): "5 864"

Test #10:

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

input:

30
6 8 9 9 9 10 13 14 15 15 16 17 17 18 20 22 22 23 23 24 24 25 25 25 27 28 28 29 29 30

output:

17 986189864

result:

ok 2 number(s): "17 986189864"

Test #11:

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

input:

123
1 1 1 2 2 3 3 6 6 7 7 7 8 8 9 9 10 10 10 11 12 12 12 13 14 14 14 14 16 17 17 17 17 17 18 19 20 20 21 21 22 22 22 23 23 23 25 25 26 27 27 28 28 28 28 29 29 30 31 31 31 32 33 33 33 34 35 35 35 36 37 37 38 39 39 39 39 40 41 41 42 42 42 43 44 48 48 50 52 53 55 56 57 57 57 58 65 68 71 74 75 76 76 82 ...

output:

42 287179924

result:

ok 2 number(s): "42 287179924"

Test #12:

score: 0
Accepted
time: 11ms
memory: 103680kb

input:

1234
1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 6 6 7 7 7 7 7 7 7 8 8 8 8 9 9 10 10 10 11 11 11 11 11 12 13 13 14 14 15 15 15 15 16 16 16 17 17 17 18 18 18 19 19 19 19 19 19 19 19 19 19 20 20 20 21 21 21 21 21 22 22 22 23 23 23 23 23 23 23 23 23 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 26 26 26 26 ...

output:

239 98119841

result:

ok 2 number(s): "239 98119841"

Test #13:

score: 0
Accepted
time: 18ms
memory: 105204kb

input:

2345
1 1 2 2 2 7 7 9 9 9 9 15 17 19 19 22 23 24 25 29 29 29 30 31 32 33 35 37 39 41 42 42 43 43 44 46 46 46 47 48 48 50 51 51 52 53 53 54 55 56 57 58 58 60 61 63 63 64 65 65 65 66 67 67 67 69 69 69 70 71 72 72 73 73 74 75 75 77 77 79 83 85 86 88 90 90 91 93 94 97 99 104 106 107 108 108 109 109 110 1...

output:

1239 588926916

result:

ok 2 number(s): "1239 588926916"

Test #14:

score: 0
Accepted
time: 793ms
memory: 130848kb

input:

3456
4 7 8 8 9 19 20 21 22 23 23 27 29 29 32 32 33 43 45 50 52 52 55 58 58 58 60 62 66 67 68 69 71 74 74 76 77 79 82 82 87 87 88 91 93 95 96 97 99 102 104 106 107 108 121 121 123 126 127 131 137 138 139 142 145 147 152 156 157 159 161 165 166 170 170 172 174 175 178 182 183 185 186 189 190 195 195 1...

output:

2239 24387925

result:

ok 2 number(s): "2239 24387925"

Test #15:

score: 0
Accepted
time: 1294ms
memory: 132440kb

input:

4456
4 7 10 10 22 24 29 33 33 34 35 37 40 41 47 48 55 61 61 65 69 71 76 91 95 99 105 105 105 110 112 113 117 117 120 121 122 123 125 127 130 134 135 138 140 141 142 142 144 150 153 154 157 162 165 169 170 170 174 175 176 178 197 198 198 201 208 211 211 212 214 214 215 217 220 224 224 225 230 231 232...

output:

3239 904395650

result:

ok 2 number(s): "3239 904395650"

Test #16:

score: -100
Wrong Answer
time: 1150ms
memory: 121336kb

input:

5000
1 5 7 8 24 28 36 47 50 56 59 64 66 85 89 94 95 95 98 108 110 117 122 155 157 158 163 172 172 179 186 197 198 220 236 251 254 254 256 265 287 288 298 302 306 312 327 336 343 344 345 348 350 360 363 364 382 382 390 399 402 406 412 421 425 435 442 445 450 451 453 478 481 490 491 496 499 500 500 50...

output:

4239 453197333

result:

wrong answer 2nd numbers differ - expected: '328488156', found: '453197333'