COJ 0560 4015划分数

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('\n')
 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 }

 

你可能感兴趣的:(OJ)