您的位置:首页 > 其它

【bzoj1008】[HNOI2008]越狱

2016-09-18 14:01 239 查看
点击这里跳往bzoj1008

Description

监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱


Input

输入两个整数M,N (1<=M<=10^8,1<=N<=10^12)


Output

可能越狱的状态数,模100003取余


Sample Input

2 3


Sample Output

6


HINT

6种状态为(000)(001)(011)(100)(110)(111)


解题思路

这一题看起来WATER!!
可是当看到“(1<=M<=10^8,1<=N<=10^12)”时。。
就不友好了!!
但让人感到欣慰的是“模100003取余”这样一来,就不用打那恶心的高精度了。

首先呢,我们就要求出不可能越狱的方案,然后呢有总数减去合法的方案。就很愉快的得出答案啦!!
这不就是小学奥数吗?!
num=m*(m-1)^(n-1)(num为合法的方案数)
all=m^n(all为方案总数)
ans=all-num(ans为答案)
直接乘?!
无疑,辣么大的数据范围,10000%超时
这就很尴尬啦!!

这时,我们就可以用power_mod,快速幂来实现这个乘法运算。
这个代码十分可观,代码即少,速度又快。真是短小而又精悍啊!!


上代码噜

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int Mod=100003;
LL s,m,n;
LL q_mod(LL a,LL b,LL c)
{
LL k=1%c; a%=c;
while(b)
{
if(b%2==1) k=k*a%c;
b/=2; a=a*a%c;
}
return k;
}
int main()
{
scanf("%lld%lld",&m,&n);
s=(q_mod(m,n,LL(Mod))-m*q_mod(m-1,n-1,LL(Mod))%LL(Mod)+LL(Mod))%LL(Mod);
printf("%lld\n",s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: