hdu 5187 zhx's contest

题意:

在1——n的排列中,求先递增后递减,先递减后递增的排列的个数

先递增后递减的每一个数,用n减去它,就是先递增后递减

枚举排列的第一个数i,枚举n的位置j

那么这个i、j对答案的贡献就是C(n-i-1,j-2)

全部列出来,发现就是杨辉三角的前n-2行

杨辉三角每一行的和为2^i

所以最终答案为(2^(n-1)-1)*2

不知道为啥printf就CE

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
LL n,p;
LL mul(LL a,LL b)
{
    LL res=0;
    while(b)
    {
        if(b&1) res+=a,res%=p;
        a<<=1,a%=p,b>>=1;
    }
    return res;
}
LL pow(LL a,LL b)
{
    LL res=1;
    while(b)
    {
        if(b&1) res=mul(res,a),res%=p;
        a=mul(a,a), a%=p, b>>=1;
    }
    return res;
}
int main()
{
    while(cin>>n>>p) cout<<(pow(2,n-1)-1+p)%p*2%p<<endl;
}

 

 
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7499530.html