Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37782 | baka24 | 【S】T4 | C++ | 运行超时 | 50 | 2000 MS | 148984 KB | 1845 | 2025-05-11 12:50:38 |
#include<bits/stdc++.h> using namespace std; #define int long long int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=1000010,N=510,Mod=998244353; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;}return rt;} void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;if(x<0)x+=Mod;} int n,m,k,jc[MAXN],ny[MAXN]; int C(int x,int y){return jc[x]*ny[y]%Mod*ny[x-y]%Mod;} void slv0(){ printf("%lld",C(k+m-1,m-1)); } void slv1(){ int ans=0; for(int i=1;i<=n;i++)add(ans,C(n,i)*C(m,i)%Mod); printf("%lld",ans); } int f[N][N],ans; void dfs(int x,int y){ if(y==m+1)x++,y=1; if(x==n+1){ if(f[n][m]==k)ans++; return; } int tmp=max(f[x-1][y],f[x][y-1]); for(int i=tmp;i<=k;i++){ f[x][y]=i; dfs(x,y+1); } } void slv2(){ dfs(1,1); printf("%lld",ans); } int g[N][N]; void slv3(){ f[n][n]=1; for(int i=1;i<=m;i++){ for(int j=0;j<=n;j++){ for(int o=j;o<=n;o++){ int tmp=0; for(int p=j;p<=n;p++)for(int q=o;q<=n;q++)add(tmp,f[p][q]); f[j][o]=tmp; } } } for(int i=0;i<=n;i++)for(int j=i;j<n;j++)add(ans,f[i][j]); printf("%lld",ans); } void slv(){ n=read(),m=read(),k=read(); if(n==1)slv0();else if(n<=500&&k==1)slv1();else if(k==2)slv3();else slv2(); } signed main(){ // freopen("mountain.in","r",stdin);freopen("mountain.out","w",stdout); // int _=read();while(_--) jc[0]=ny[0]=1; for(int i=1;i<=MAXN-5;i++)jc[i]=jc[i-1]*i%Mod; ny[MAXN-5]=Pow(jc[MAXN-5],Mod-2); for(int i=MAXN-6;i>=1;i--)ny[i]=ny[i+1]*(i+1)%Mod; slv(); return 0; }