codeforces-57C Array(找规律+逆元)

来源:互联网 发布:彩影软件下载 编辑:程序博客网 时间:2024/05/16 18:23

题目链接:点击打开链接

题意:给出一个整数n,要求找到长度为n的数组,满足该数组的元素是有[1,n]内的任意元素组成的,且该数组为非递减数组或非递增数组,求满足条件的数组的总个数。

分析:因为非递减数组和非递增数组具有对称性,可以只讨论非递减数组的个数,设其为x,则总个数为2x-n(n为非递减数组和非递增数组交叉的部分,即既不递减也不递增)。

通过分析讨论结果可以得到总个数为C(2n,n)-n,注意求阶乘取模时要用到逆元。


#include<iostream>//一道规律题,结果是C(2n,n)-n#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int mod=1000000007;ll pow_mod(ll a,ll b,ll m){    ll d,t;    d=1;    t=a;    while (b>0)    {        if (b%2==1)            d=(d*t)%m;        b/=2;        t=(t*t)%m;    }    return d;}int main(){    ll n;    while(~scanf("%I64d",&n))    {        ll a=1;        for(int i=n+1;i<=2*n;i++)            a=(a*i)%mod;        ll b=1;        for(int i=1;i<=n;i++)            b=(b*i)%mod;        b=pow_mod(b,mod-2,mod)%mod;        ll ans=a*b%mod-n;        printf("%I64d\n",ans);    }    return 0;}


0 0
原创粉丝点击