4015 划分数 |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:262144KB; 代码长度限制:2000000B |
试题描述
|
有n个无区别的物品,将他们划分成不超过m组,求出划分方法数模1e9的余数
|
输入
|
输入共一行:为两个正整数n,m。
|
输出
|
输出共一行:为方案数。
|
输入示例
|
4 3
|
输出示例
|
4
|
其他说明
|
1<=m,n<=5000
|
题解:余一法
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<queue> 6 #include<cstring> 7 #define PAU putchar(' ') 8 #define ENT putchar(' ') 9 using namespace std; 10 const int maxn=5000+10,mod=1e9; 11 int d[maxn][maxn],n,m; 12 inline int read(){ 13 int x=0,sig=1;char ch=getchar(); 14 while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();} 15 while(isdigit(ch)) x=10*x+ch-'0',ch=getchar(); 16 return x*=sig; 17 } 18 inline void write(int x){ 19 if(x==0){putchar('0');return;}if(x<0) putchar('-'),x=-x; 20 int len=0,buf[15];while(x) buf[len++]=x%10,x/=10; 21 for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return; 22 } 23 void init(){ 24 n=read();m=read(); 25 d[0][0]=1; 26 for(int i=1;i<=m;i++) 27 for(int j=0;j<=n;j++) 28 if(j>=i) d[i][j]=d[i-1][j]+d[i][j-i],d[i][j]%=mod; 29 else d[i][j]=d[i-1][j]; 30 write(d[m][n]); 31 return; 32 } 33 void work(){ 34 return; 35 } 36 void print(){ 37 return; 38 } 39 int main(){ 40 init();work();print();return 0; 41 }