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; }