一道组合数取模题

来源:互联网 发布:java泛型是什么 编辑:程序博客网 时间:2024/06/04 19:37

题目大意:求长度为n且每项均在[1,n]的不上升数列与不下降数列的个数和。

思路:总数就是不下降数列的个数*2-n(常数列的个数)

然后考虑不下降数列的个数

为了方便,把第0项设为0,把第n+1项设为n。

差分,然后不下降数列就是差分数组a[i]每一项大于等于0,且Σa[i]=n。

每项+1,就相当于在2n-1个空位(本来是2n+1,首尾不能放)放n个板子。

于是答案就是C(2n-1,n)*2-n

因为要取模,因为逆元可乘,所以上面和下面的阶乘都可以先乘起来再求逆元。

#include<cstdio>#include<cstring>#include<algorithm>const int mod=2000003;using namespace std;typedef long long ll;int n;ll qpow(ll a,int b){ll res=1;for (ll j=a;b;j=j*j%mod,b>>=1)if (b&1) res=res*j%mod;return res;}void work(int n){ll ans,A=1,B=1;for (int i=n;i<=2*n-1;i++) A=A*i%mod;for (int i=1;i<=n;i++) B=B*i%mod;for (int i=0;i<mod;i++)if (i*B%mod==A%mod){ans=i;break;}ans=((ans*2-n)%mod+mod)%mod;printf("%I64d\n",ans);}int main(){scanf("%d",&n),work(n);return 0;}



0 0
原创粉丝点击