链接: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;
}