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

题目链接:点击打开链接

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

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

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


#include//一道规律题,结果是C(2n,n)-n
#include
#include
#include
#include
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;
}


你可能感兴趣的:(ACM,ACM-数学)