2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛) Chino with Equation(组合公式)

链接:https://ac.nowcoder.com/acm/contest/553/D
来源:牛客网

题目描述

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

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

输入描述:

两个正整数m, n

输出描述:

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

输入

复制

4 7

输出

复制

20 120

思路:这道题我们可以抽象成 有n个球 要放在m个箱子里面 箱子不能为空的方案数 和箱子可以为空的方案数 这样我们就能插空法解决这道题 

想像n-1个空位要插m-1个间隙 就是C(n-1,m-1) 同理  想像n+m-1个空位要插m-1个间隙 就是C(n-1,m-1) 在其中求下逆元即可

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long int
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
ll fact[2000007];
void f(){
    fact[0]=1;
    for(ll i=1;i<=2000000;i++) fact[i]=fact[i-1]*i%mod;
}
ll q_pow(ll a,ll n){
    ll ans=1; ll base=a;
    while(n){
        if(n&1) ans=(ans*base)%mod;
        base=base*base%mod;
        n>>=1;
    }
        return ans;
}
ll inv(ll a,ll b){
    return q_pow(a,b-2);
} 
ll C(ll n,ll m){
    return fact[n]*(inv(fact[n-m]*fact[m]%mod,mod)%mod)%mod;
}
int main(){
    ios::sync_with_stdio(false);
    ll m,n;
    f();
    while(cin>>m>>n){
        cout<<C(n-1,m-1)<<" "<<C(m+n-1,m-1)<<endl;
    }
    
}

猜你喜欢

转载自www.cnblogs.com/wmj6/p/10665791.html