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;
}
posted @ 2021-01-19 01:52  ZZHHOOUU  阅读(126)  评论(0)    收藏  举报