题解
2023-08-26 10:56:03
发布于:广东
7阅读
0回复
0点赞
#include<bits/stdc++.h>
#define maxn 50010
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,k,p,m;
int f[maxn],g[maxn];
int main()
{
read(n),read(k),read(p),m=n*(n-1)/2,f[0]=1;
for(int i=1;i<=n;++i)
{
for(int j=m;j>=i;--j) f[j]=(f[j]-f[j-i]+p)%p;
for(int j=1;j<=m;++j) f[j]=(f[j]+f[j-1])%p;
}
for(int i=1;i<=n;++i) g[i]=f[k];
for(int i=2;i<=n;++i)
{
for(int j=m;j;--j) f[j]=(f[j]-f[j-1]+p)%p;
for(int j=i;j<=m;++j) f[j]=(f[j]+f[j-i])%p;
for(int j=1;j+i-1<=n;++j)
{
if(k-i+1>=0) g[j]=(g[j]+f[k-i+1])%p;
g[j+i-1]=(g[j+i-1]+f[k])%p;
}
for(int j=m;j>=i;--j) f[j]=(f[j]-f[j-i]+p)%p;
for(int j=1;j<=m;++j) f[j]=(f[j]+f[j-1])%p;
}
for(int i=1;i<=n;++i) cout<<g[i]<<' ';
return 0;
}
这里空空如也
有帮助,赞一个