您的位置:首页 > 编程语言

HDU 5187 zhx's contest(快速乘法)

2015-03-23 15:35 344 查看
题目地址:HDU 5187

分凸型与凹型讨论,对于每一种来说,分别有C(n-1,0)+C(n-1,1)+…+C(n-1,n-1)=2^(n-1)种情况,然后合起来共2^n种情况,有两种重复的,所以共2^n-2中情况。于是快速幂,但是由于mod为LL 型,在快速幂过程中会爆LL。所以在快速幂的乘法时,用快速乘法,原理跟快速幂一模一样。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
LL mod;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
const int MAXN=1100000;
LL Mult(LL n, LL k)
{
LL ans=0;
while(k>0){
if(k&1) ans=(ans+n)%mod;
k>>=1;
n=(n+n)%mod;
}
return ans;
}
LL qsm(LL n, LL k)
{
LL ans=1;
while(k>0){
if(k&1) ans=Mult(ans,n)%mod;
k>>=1;
n=Mult(n,n)%mod;
}
return ans;
}
int main()
{
LL n, ans;
while(scanf("%I64d%I64d",&n,&mod)!=EOF){
if(n==1){
printf("%I64d\n",1%mod);
continue ;
}
ans=qsm(2,n);
printf("%I64d\n",(ans+mod-2)%mod);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 编程 算法 快速幂