LightOj 1282 Leading and Trailing
求n^k的前三位数字和后三位数字。
范围: n (2 ≤ n < 231) and k (1 ≤ k ≤ 107).
前三位: 设 n^k = x
---> lg(n^k)=lg(x)
---> klg(n)=lg(x)
---> x=10^(klgn).
因为求前三位,klgn大于2的整数部分可以舍弃。bit=floor(klgn-2), x=10^(klgn-bit)。
后三位:快速幂模1000即可。
代码:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; typedef long long ll; //n (2 ≤ n < 2^31) and k (1 ≤ k ≤ 10^7). ll mod_pow(ll a, ll b, ll mod) { ll res = 1; while (b > 0) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } int calc(int n, int k) { int bit = floor(k * log10(n) - 2); return floor(pow(10, k * log10(n) - bit)); } int main() { int n, k; int t; scanf("%d", &t); for (int cas = 1; cas <= t; ++cas) { scanf("%d%d", &n, &k); int first = calc(n, k); int last = mod_pow(n, k, 1000); printf("Case %d: %3d %03d\n", cas, first, last); } return 0; }