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;
}
原文地址:https://www.cnblogs.com/IzumiSagiri/p/14296043.html