BZOJ1008 /乘法原理+快速幂 解题报告
2016-10-14 22:31
239 查看
1008: [HNOI2008]越狱
Description
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
Input
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12Output
可能越狱的状态数,模100003取余Sample Input
2 3Sample Output
6HINT
6种状态为(000)(001)(011)(100)(110)(111)分析:
很显然,这是一道数学题。起初来想这道题可能会去想怎么去组合会越狱的方式。但是我们发现。会越狱的情况只要是两个宗教在一起就可能会出现火花。而不越狱呢只要不坐在一起就好;所以这里组合的方向就出来了。我们可以用全部组合减去不会越狱的组合。嗯是这样。第一个位置有m种选择。第二个位置就有m-1种选择。之后一直到n都只会有m-1种选择。所以:
Ans = m^n - m * (m-1)^(n-1)
就是这样。贴出代码:
/************************************************************** Problem: 1008 User: oscarcode Language: C++ Result: Accepted Time:0 ms Memory:820 kb ****************************************************************/ #include<cstdio> long long int n,m; long long int mi(long long int a,long long int b) { long long int r=1; while(b) { if(b&1) { r=(a%100003)*(r%100003)%100003; r%=100003; } a=(a%100003)*(a%100003); a%=100003; b>>=1; } return r; } int main() { scanf("%lld%lld",&m,&n); long long int ans=mi(m,n); ans=ans-m*mi(m-1,n-1)%100003+100003; //不要忘了加上个模数,不然会变成负数。嗯就是这样。 ans%=100003; printf("%lld",ans); return 0; }
相关文章推荐
- BZOJ 1008 组合数学 解题报告
- BZOJ 1008 - HNOI 2008 越狱 乘法原理 快速幂
- 2014年第五届蓝桥杯预赛 C/C++本科B组 快速解题思路及报告(完整版,4.9修订)
- BZOJ 2463 数论(欧拉函数) 解题报告
- BZOJ 1052 二分答案 解题报告
- bzoj 3687 简单题 bitset 解题报告
- [bzoj4066]简单题 解题报告
- bzoj 1008 越狱(快速幂)
- POJ1008解题报告
- poj_1008_Maya Calendar_解题报告
- 【乘法原理】【HNOI 2008】【bzoj 1008】越狱
- BZOJ 3969 Low Power 解题报告
- BZOJ 3953 Self-Assembly 解题报告
- BZOJ 3971 Матрёшка 解题报告
- BZOJ 2428 模拟退火 解题报告
- BZOJ4010: [HNOI2015]菜肴制作 解题报告
- BZOJ 3754 Tree之最小方差树 解题报告
- BZOJ 3524 主席树(随机数水过) 解题报告
- BZOJ 4726 [POI 2017] 树DP 解题报告
- BZOJ 3193 [JLOI 2013] 计数DP 解题报告