WUSTOJ 1317: cms的苦恼(Java)快速幂

题目链接:🔗1317: cms的苦恼
参考:🔗快速幂_百度百科

Description

cms最近经常爱发呆,导致苦恼指数一直上升,cms每发呆一分钟苦恼指数变成原来的a倍,已知当前cms的苦恼指数为c,求他发呆b分钟后的苦恼指数。由于结果比较大,最后结果对100000007求模。
数据范围:
abc均为整数。
1 =< abc <= 109

Input

多组测试数据,每组输入a b c

Output

每组输出一个苦恼指数。

Sample Input

2 2 2

Sample Output

8

分析💬

题意:计算cabc \cdot a^{b},当超过100000007的时候,对它取模。

根据数据范围,显然已经超过int型(2147483647)的范围,因此abc应该定义为long型。

示例

输入

8 9 10

(9)10=(1001)2权值分别为8,1。

ans=1089=108881=108188ans=10 \cdot 8^{9}=10 \cdot 8^{8} \cdot 8^{1}=10 \cdot 8^{1} \cdot 8^{8}

手算过程(可以对照代码计算)如下,推导顺序:从左往右,从上往下

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
效率比较
算法 时间复杂度(OO 提交用时(ms)
普通(循环) nn 267
快速幂 log(n)log(n) 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();
	}
}

版权声明

  1. 转载、参考、引用必须在首页添加如下文字:
    [WUSTOJ 1317: cms的苦恼(Java)快速幂——wowpH](https://blog.csdn.net/pfdvnah/article/details/93128146)
  2. 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
  3. 如果有疑问欢迎评论区留言,尽量解答;
  4. 如果有错误,还望大侠评论区指正。

posted @ 2019-06-21 09:50  wowpH  阅读(178)  评论(0)    收藏  举报