标签:
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://blog.csdn.net/lvshubao1314/article/details/44275697