E

/**
题目:E - Leading and Trailing
链接:https://vjudge.net/contest/154246#problem/E
题意:求n^k得前三位数字以及后三位数字,保证一定至少存在六位。
思路:后三位求法只要不断对1000取余就行了。
前三位求法:
对一个数x,他可以用科学计数法表示为10^r*a (r为次方,1<=a<10)
设:n^k = x = 10^r*a
两边取对数: k*log10(n) = log10(x) = r+log10(a);
令y = k*log10(n); 因为r是整数,1<=a<10所以0<=log10(a)<1
所以log10(a)为y的小数部分;即log10(a) = y-(long long)y;
a = 10^(y-(long long)y);
最终结果为:(long long)(a*100)即为前三位;
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+100;
///后三位
ll Least(ll n,ll k)
{
    ll p = 1;
    while(k>0){
        if(k&1) p = p*n%1000;
        n = n*n%1000;
        k >>= 1;
    }
    return p;
}
///前三位
ll Leading(ll n,ll k)
{
    double y = k*log10(n);
    double a = pow(10.0,y-(ll)y);
    return (ll)(a*100);
}
int main()
{
    int T, cas=1;
    ll n, k;
    cin>>T;
    while(T--){
        scanf("%lld%lld",&n,&k);
        ///注意这里后三位要输出三位。
        printf("Case %d: %lld %03lld
",cas++,Leading(n,k),Least(n,k));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xiaochaoqun/p/6618130.html