链接:https://ac.nowcoder.com/acm/contest/553/D
来源:牛客网
题目
Chino的数学很差,因此Cocoa非常担心。今天,Cocoa要教Chino解不定方程。
众所周知,不定方程的解有0个或者若干个。
给出方程:
Cocoa想知道这个不定方程的正整数解和非负整数解各有几个。
题目对Chino来说太难啦,你能帮一帮Chino吗?
输入描述:
两个正整数m, n
输出描述:
题目要求的答案,即正整数解的个数和非负整数解的个数 。由于答案可能会很大,你只需要输出答案 mod(10^9 + 7) 即可。
样例
输入
4 7
输出
20 120
题解
高中学过一个组合数学的一个方法,隔板法。
百度百科讲的隔板法就挺好的,链接https://baike.baidu.com/item/%E9%9A%94%E6%9D%BF%E6%B3%95/3902458?fr=aladdin
没零的情况下的方案数是C(n-1, m-1)
有零的情况下的方案数是C(n+m-1, m-1)
代码
#include<algorithm>
#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=2e6+5;
const int mod=1e9+7;
ll fac[maxn];
int n,m;
void init(){
fac[0]=fac[1]=1;
for(int i=2;i<=2*n;i++){
fac[i]=fac[i-1]*i%mod;
}
}
ll ksm(ll a,ll k){
a%=mod;
ll ans=1;
while(k){
if(k&1) ans=ans*a%mod;
k>>=1;
a=a*a%mod;
}
return ans;
}
int main(){
cin>>m>>n;
init();
ll ans=fac[n-1]*ksm(fac[m-1]*fac[n-m],mod-2)%mod;
ll ans2=fac[n+m-1]*ksm(fac[m-1]*fac[n],mod-2)%mod;
cout<<ans<<" "<<ans2<<endl;
return 0;
}