QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#155692#6410. Classical DP ProblemForever_Young#TL 17ms105308kbC++143.6kb2023-09-02 00:55:202023-09-02 00:55:22

Judging History

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

  • [2023-09-02 00:55:22]
  • 评测
  • 测评结果:TL
  • 用时:17ms
  • 内存:105308kb
  • [2023-09-02 00:55:20]
  • 提交

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){
	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);
    }
}

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;
		for (int i=1;i<=n;i++){
			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];
			NTT::multiply(nt,z+1,ant,z+1);
			for (int j=0;j<=z;j++) g[i+1][j]=1ll*nt[j]*ifac[z-j]%mod;
			//for (int j=0;j<=z;j++) printf("%d %d %d\n",i,j,g[i+1][j]);
			if (a[i]>r){
				for (int j=0;j<=r;j++) g[i+1][j]=(g[i+1][j]-g[i][j]+mod)%mod;
			}
			/*
			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: 7ms
memory: 104424kb

input:

3
1 2 3

output:

2 6

result:

ok 2 number(s): "2 6"

Test #2:

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

input:

1
1

output:

1 1

result:

ok 2 number(s): "1 1"

Test #3:

score: 0
Accepted
time: 17ms
memory: 103700kb

input:

2
1 1

output:

1 2

result:

ok 2 number(s): "1 2"

Test #4:

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

input:

2
2 2

output:

2 6

result:

ok 2 number(s): "2 6"

Test #5:

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

input:

3
1 1 1

output:

1 3

result:

ok 2 number(s): "1 3"

Test #6:

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

input:

3
2 2 2

output:

2 9

result:

ok 2 number(s): "2 9"

Test #7:

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

input:

3
3 3 3

output:

3 48

result:

ok 2 number(s): "3 48"

Test #8:

score: 0
Accepted
time: 12ms
memory: 105304kb

input:

5
1 1 3 3 4

output:

3 47

result:

ok 2 number(s): "3 47"

Test #9:

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

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: 7ms
memory: 105232kb

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: 14ms
memory: 105308kb

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: 7ms
memory: 103380kb

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: 16ms
memory: 104160kb

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: -100
Time Limit Exceeded

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:


result: