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;
}

  

posted @ 2015-08-19 15:17  我不吃饼干呀  阅读(169)  评论(0编辑  收藏  举报