How Many Sets II(Lucas定理模板)
阿新 • • 發佈:2018-12-16
【題意】 從n個相同小球中取m個小球,不能取相鄰的小球的方案數
【思路】 首先拿出 個小球,還剩下 個小球。這 個小球一共有 個空(左右兩邊也可以),把這 個小球插入到這 個空裡就是答案,即,記錄一下 定理的模板
Lucas 定理
求解 首先將n和m分解為p進位制: 那麼
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=10050; int mod; ll pw(ll x,ll n){ ll ans=1LL; while(n){ if(n&1) ans=ans*x%mod; x=x*x%mod; n>>=1; } return ans; } ll inv(ll a){return pw(a,mod-2);} ll C(int n,int m){ if(m>n) return 0LL; ll up=1LL,down=1LL; for(int i=n-m+1;i<=n;++i) up=up*i%mod; for(int i=1;i<=m;++i) down=down*i%mod; return up*inv(down)%mod; } ll Lucas(int n,int m){ if(m>n) return 0LL; ll ans=1LL; for (;m;n/=mod,m/=mod) ans=ans*C(n%mod,m%mod)%mod; return ans; } int main(){ int n,m; while(scanf("%d%d%d",&n,&m,&mod)==3){ printf("%lld\n",Lucas(n-m+1,m)); } return 0; }