WUSTOJ 1317: cms的苦恼(Java)快速幂
题目链接:🔗1317: cms的苦恼
参考:🔗快速幂_百度百科
Description
cms最近经常爱发呆,导致苦恼指数一直上升,cms每发呆一分钟苦恼指数变成原来的a倍,已知当前cms的苦恼指数为c,求他发呆b分钟后的苦恼指数。由于结果比较大,最后结果对100000007求模。
数据范围:
a,b,c均为整数。
1 =< a,b,c <= 109
Input
多组测试数据,每组输入a b c
Output
每组输出一个苦恼指数。
Sample Input
2 2 2
Sample Output
8
分析💬
题意:计算,当超过100000007的时候,对它取模。
根据数据范围,显然已经超过int型(2147483647)的范围,因此a,b,c应该定义为long型。
示例
输入
8 9 10
(9)10=(1001)2权值分别为8,1。
手算过程(可以对照代码计算)如下,推导顺序:从左往右,从上往下
| c | a | b |
|---|---|---|
| 10 | 8 | 9(末位是1) |
| 10 × 8 = 80 | 8 × 8 = 64 | 9 / 2 = 4(末位是0) |
| 80 | 64 × 64 = 4096 | 4 / 2 = 2(末位是0) |
| 80 | 4096 × 4096 = 16777216 | 2 / 2 = 1(末位是1) |
| (80 × 166777216) % 100000007 = 42177189 | (16777216 × 16777216) % 100000007 = 57007413 | 1 / 2 = 0(结束) |
输出
42177189
效率比较
| 算法 | 时间复杂度() | 提交用时(ms) |
|---|---|---|
| 普通(循环) | 267 | |
| 快速幂 | 998 |
代码
/**
* Time 267ms
* @author wowpH
* @version 1.2
* @date 2019年6月20日下午8:07:21
* Environment: Windows 10
* IDE Version: Eclipse 2019-3
* JDK Version: JDK1.8.0_112
*/
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(new InputStreamReader(System.in));
long a, b, c;
while (sc.hasNext()) {
a = sc.nextLong();
b = sc.nextLong();
c = sc.nextLong();
do {
if (1 == (b & 1)) {// b最后一位是否是1
c = (c * a) % 100000007;// 乘以权值
}
a = (a * a) % 100000007;// 新的权值
b >>= 1;// 指数除以2
} while (b > 0);
System.out.println(c);
}
sc.close();
}
}
版权声明
- 转载、参考、引用必须在首页添加如下文字:
[WUSTOJ 1317: cms的苦恼(Java)快速幂——wowpH](https://blog.csdn.net/pfdvnah/article/details/93128146) - 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
- 如果有疑问欢迎评论区留言,尽量解答;
- 如果有错误,还望大侠评论区指正。

浙公网安备 33010602011771号