LightOJ 1282 Leading and Trailing
题目链接: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;
}

浙公网安备 33010602011771号