【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; }
相关文章推荐
- [bzoj 1008--HNOI2008]越狱
- [组合]Bzoj1008 越狱[HNOI2008]
- Bzoj1008 [HNOI2008]越狱
- BZOJ 1008 [HNOI2008]越狱 排列组合
- bzoj1008[HNOI2008]越狱
- bzoj 1008: [HNOI2008]越狱
- bzoj1008: [HNOI2008]越狱
- bzoj1008: [HNOI2008]越狱 数学
- [bzoj1008] [HNOI2008]越狱
- BZOJ1008[HNOI2008]越狱
- 【乘法原理】【HNOI 2008】【bzoj 1008】越狱
- bzoj1008: [HNOI2008]越狱(第100篇文章纪念)
- BZOJ 1008 [HNOI2008]越狱 (简单排列组合 + 快速幂)
- BZOJ 1008([HNOI2008]越狱-等比数列求和)
- BZOJ1008: [HNOI2008]越狱 快速幂
- bzoj。1008: [HNOI2008]越狱(快速幂 组合数)
- [BZOJ1008][HNOI2008]越狱
- bzoj 1008: [HNOI2008]越狱
- bzoj1008 [HNOI2008]越狱
- [BZOJ1008] [HNOI2008]越狱