/** 题目: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; }