YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题解:求n^k的前三位和后三位。

后三位直接快速幂对1000去余就可以了。前三位可以转换成浮点数来操作,也是用快速幂,我们只保留答案的前三位,当前值大于1000.0的话就除以10,直到结果小于等于1000.0。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
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;
}
void getnum(double &x){
    while(x>=1000.0) x/=10;  
}
void solve(ll time){
    ll n,k;
    cin>>n>>k;
    ll c=ksm(n,k);
    double res=1.0,a=n*1.0;
    while(k){
        if(k&1){
            res=res*a;
            getnum(res);
        }
        a=a*a;
        getnum(a);
        k>>=1;
    }
    ll ans=res;
    
    printf("Case %d: %lld %03lld\n",time,ans,c);
}
int main(){
    ll t;
    cin>>t;
    for(ll i=1;i<=t;i++) solve(i);
    return 0;
 } 

 

 

posted on 2020-04-01 20:03  Target--fly  阅读(111)  评论(0编辑  收藏  举报