多元一次不定方程解的个数

链接:https://ac.nowcoder.com/acm/contest/553/D
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

Chino的数学很差,因此Cocoa非常担心。今天,Cocoa要教Chino解不定方程。
众所周知,不定方程的解有0个或者若干个。
给出方程:

Cocoa想知道这个不定方程的正整数解和非负整数解各有几个。
题目对Chino来说太难啦,你能帮一帮Chino吗?

输入描述:

两个正整数m, n

输出描述:

题目要求的答案,即正整数解的个数和非负整数解的个数 。由于答案可能会很大,你只需要输出答案 mod(109 + 7) 即可。

示例1

输入

4 7

输出

20 120

解析:

正整数解的个数: C(n-1,m-1)

非负整数解的个数: C(n+m-1,m-1)

排列组合数模板:排列组合模板

ac:

#include
#define ll long long
#define mod (ll)(1e9+7)
using namespace std;
ll a[2000005];

ll Pow(ll a,ll b){
    a%=mod;
    ll ans = 1;
    while(b)
    {
        if(b&1)
            ans = (ans*a)%mod;
        a = (a*a)%mod;
        b/=2;
    }
    return ans%mod;
}

ll Quk(ll a,ll b){
    a%=mod;
    ll ans = 0;
    while(b)
    {
        if(b&1)
            ans = (ans+a)%mod;
        a = (a+a)%mod;
        b/=2;
    }
    return ans%mod;
}

ll C(ll n,ll m){
    return Quk(Quk(a[n],Pow(a[n-m],mod-2)),Pow(a[m],mod-2))%mod;
}

int main()
{
    a[0]=a[1]=1;
    for(ll i=2;i<=2000001;i++)
        a[i]=Quk(a[i-1],i);
    ll n,m;
    cin>>m>>n;
    printf("%lld %lld\n",C(n-1,m-1),C(n+m-1,m-1));
    return 0;
}

 

你可能感兴趣的:(组合数学)