题目链接:LightOJ 1282 Leading and Trailing
题目大意:
求(n^k)的前三位和后三位。
题解:
后三位直接快速幂模板。
前三位如下:
设(x=log_{10}(n^k)=k*log_{10}(n)),那么(10^x=n^k)。
设(x=a(整数)+b(小数)),
整数部分(10^a)是小数点的位置,并不影响前三位数字。
故只需要求出(10^b),(10^b)是((1,10))的浮点数,所以乘(100)取整数部分就是前三位。
使用(fmod(x,1))求浮点型数(x)的小数部分。
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
#define ll long long
ll fastpow(ll n, ll k, ll mod) {
ll res = 1;
while (k) {
if (k & 1) {
res = res * n % mod;
}
n = n * n % mod;
k >>= 1;
}
return res;
}
int main() {
int t;
cin >> t;
for (int i = 1; i <= t; ++i) {
ll n, k;
cin >> n >> k;
int lead = (int)pow(10.0, 2.0 + fmod(k * log10(n * 1.0), 1.0));
int trail = (int)fastpow(n, k, 1000);
cout << "Case " << i << ": " << lead << " " << setw(3) << setfill('0') << trail << endl;
}
return 0;
}