标签:
http://acm.hdu.edu.cn/showproblem.php?pid=5187
2 233 3 5
2 1HintIn the first case, both sequence {1, 2} and {2, 1} are legal. In the second case, sequence {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1} are legal, so the answer is 6 mod 5 = 1
/** hdu 5187 高速幂高速乘法 题目大意:(转)数字1~n,按某种顺序排列。且满足下列某一个条件:(1)a1~ai递增,ai~an递减(2)a1~ai递减,ai~an递增。 问有多少种不同的排列。 解题思路:首先是所有递减或所有递增各一种;另外就是满足上列两个条件的情况了。要想满足条件(1)那就仅仅能把最大的n放在i位置, 共同拥有C(1,n-1)+C(2。n-1)+。。。+C(n-2,n-1)即2^(n-1)-2;条件(2)与(1)同样,所以共同拥有(2^(n-1)-2)*2+2=2^n-2. **/ #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; LL n,p; LL qui_mul(LL x,LL m)///高速乘法 { LL re=0; while(m) { if(m&1) { re=(re+x)%p; } x=(x+x)%p; m>>=1; } return re; } LL qui_pow(LL a,LL n)///高速幂 { LL ret=1; LL tem=a%p; while(n) { if(n%1)ret=qui_mul(ret,temp)%p; temp=qui_mul(temp,temp)%p; n>>=1; } return ret; } int main() { while(~scanf("%I64d%I64d",&n,&p)) { if(n==1) { if(p==1) printf("0\n"); else printf("1\n"); } printf("%I64d\n",(qui_mul(2,n)-2)%p); } return 0; }
标签:
原文地址:http://www.cnblogs.com/yxwkf/p/5066826.html