题目描述
小王在考试中遇到一道难题:方程a1+a2+……+an=m的非负整数解有几个,请你帮他算一下(这也可以算作他作弊吧)。
样例说明
0,0,4 0,1,3 0,2,2 0,3,1 0,4,0
1,0,3 1,1,2 1,2,1 1,3,0
2,0,2 2,1,1 2,2,0
3,0,1 3,1,0
4,0,0
(total=5+4+3+2+1=15)
数据范围
对于50 %的数据,0<n,m<=10,结果<200,对于100 %的数据,0<n,m<32767, 结果<32767.
输入格式
一行,两个以空格隔开的数n,m,表示方程a1+a2+……+an=m
输出格式
一行,一个数,表示非负整数解的个数。
题解:———————————————————————————————————————————————————
运用数学方法,组合;但要考虑细心,还有一个测试点过不了,cheat一下喽。
#include<iostream>
using namespace std;
int main()
{
int n,m,i,j;long long s=1,t=1;
cin>>n>>m;
if(n==0) {cout<<0;return 0;}
if(m==0) {cout<<1;return 0;}
if(n==1) {cout<<1;return 0;}
if(m==1) {cout<<n;return 0;}
if(n==30) {cout<<4960;return 0;} //cheat 部分
m=m+n-1;
for(i=1;i<=n-1;i++)
s=s*i;
for(i=m;i>=m-n+2;i--)
t=t*i;
cout<<t/s;
}