学长的白日梦(C++) --- 快速幂 + 快乘(模板) 解题

链接:https://ac.nowcoder.com/acm/contest/7872/F
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

20级的学弟学妹们来了,实验室里可怜弱小又无助的wzc学弟终于变成了学长,可以压迫下一级了(?)。

但是wzc学长苦于自己的实力进步太慢,很担心自己在学弟学妹们面前丢人,所以天天熬夜在实验室里训练。

某一天wzc学长训练得实在太累了,居然在大白天做起了梦。

在梦里面,wzc学长在第一天有一个初始的码力值x,第二天的时候码力值变为了x^2,第三天的时候码力值变为了x^3......第i天的时候码力值变为了x^i。

现在wzc学长想知道第i天的时候,他的码力值是多少。由于这个值可能非常大,请输出对9999999967取模的结果。

输入描述:

 

第一行一个整数T,代表输入数据组数。(1≤T≤1×103)

接下来T行,每行两个整数x和i,代表第一天的初始码力值,和所要求的是第几天的码力值。

(1≤x≤10,不会吧不会吧,不会真的有人这么弱吧)

(1≤i≤1×109)

输出描述:

 

输出T行,每行一个整数,代表xi对9999999967取模的结果。

示例1

输入

 

2
1 1000000000
2 3

输出

 

1
8

 


 

 

解题代码

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll mod = 9999999967;

//快乘 计算 x * y 
ll kc(ll x, ll y) { 
	ll result = 0;
	while (y > 0) {
		if (y & 1) { //此处等价于 if (y % 2 == 1)
			result = (result + x) % mod;
		}
		
		y >>= 1; //此处等价于 y = y / 2;
		x = 2 * x % mod;
	}
	
	return result;
}

//快速幂 计算 base^power 
ll ksm(ll base, ll power) { 
//这里可以先取模,有些题目会卡这个点,比如1 ^ 0 % 1,power为0不进去下面的while循环,则返回了一个1,但是被1取模后 应该得返回0的
	ll result = 1 % mod; 
	while (power > 0) {
		if (power & 1) { //此处等价于 if (power % 2 == 1)
			 result = kc(result, base);
		}
		
		power >>= 1; //此处等价于 power = power / 2
		base = kc(base, base);
	}
	
	return result;
}

int main()
{
	int t;
	scanf("%d", &t);
	while (t--) {
		ll base, power; //base为底数, power为指数
		scanf("%lld %lld", &base, &power);
		printf("%lld\n", ksm(base, power));
	}
	
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重剑DS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值