题目链接:点击打开链接
题意:给出一个整数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;
}