E - Leading and Trailing

题目

给定两个数n,k 求n^k的前三位和最后三位
n是int范围,

分析

求后三位很简单,就是在快速幂的过程中模1000即可。但是求前三位就比较难处理了,用快速幂解决不了。这里我们可以考虑将其转换成double,如果可以转换成double计算,我们只要取出double结果的前三位就可以了。这里开始讲高中的数学导数:对于任意一个数,都可以转换成导数的形式,比如,所以这里的可以转换成.
x表示次方的整数部分,y表示次方的小数部分,我们可以发现无非是将的小数点往右移动x位而已。所以我们只需要将的小数点往右移动2位,此时整数部分就有3位了,然后转换成int就求出来了。
因为 所以肯定是,本身就有一个整数位,所以只需要移动2位就行

AC代码

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;

ll a,b;
int T;

ll ksm(ll a,ll b){
    ll res = 1;
    while(b){
        if(b&1) res = res*a%1000;
        a = a*a%1000;
        b>>=1;
    }
    return res;
}
int main(){
    cin>>T;
    int kase = 0;
    while(T--){
        scanf("%lld %lld",&a,&b);
        ll trail = ksm(a,b);
        double y = fmod(b*log10(a),1); //取出次方的小数部分
        ll head = (ll)(pow(10,y)*100);//计算后,往右移动2位
        printf("Case %d: %03lld %03lld\n",++kase,head,trail);
    }

    return 0;
}