题意: 给定
n
n
n和
k
k
k,求
n
k
n^k
nk的前三位和后三位,不足三位补前导
0
0
0。
数据范围:
2
≤
n
<
2
31
,
1
≤
k
≤
1
0
7
2\leq n < 2^{31}, 1\leq k \leq 10^7
2≤n<231,1≤k≤107,保证
l
e
n
(
n
k
)
≥
6
len(n^k)\geq6
len(nk)≥6
题解: 后三位直接模
1000
1000
1000快速幂即可。
对于任意一个数表示成科学计数法:数有
l
e
n
len
len位,
n
k
=
a
×
1
0
l
e
n
−
1
,
a
∈
[
1
,
10
)
n^k=a\times10^{len-1},a\in[1,10)
nk=a×10len−1,a∈[1,10)
那么只要求出
a
a
a后乘
100
100
100即可。
l
e
n
=
l
g
(
n
k
)
len=lg(n^k)
len=lg(nk)
对两边同取
l
o
g
10
log_{10}
log10,则
k
l
g
(
n
)
=
l
g
(
a
)
+
(
l
e
n
−
1
)
klg(n)=lg(a)+(len-1)
klg(n)=lg(a)+(len−1),得
a
=
1
0
k
l
g
(
n
)
−
(
l
e
n
−
1
)
a=10^{klg(n)-(len-1)}
a=10klg(n)−(len−1)
代码:
#include<bits/stdc++.h>
using namespace std;
int qp(int a, int b, int mod = 1000) {
int ans = 1;
while(b) {
if(b & 1) ans = 1ll * ans * a % mod;
a = 1ll * a * a % mod;
b >>= 1;
}
return ans;
}
int main()
{
int T; scanf("%d", &T);
for(int i = 1; i <= T; ++i){
int n, k;
scanf("%d%d", &n, &k);
int en3 = qp(n, k);
int len = k * log10(1.0 * n);
double x = pow(10, k * log10(1.0 * n) - (len - 1));
while(x < 100) x *= 10;
int fir3 = floor(x);
printf("Case %d: %03d %03d\n", i, fir3, en3);
}
return 0;
}