题目:http://www.lightoj.com/volume_problemstat.php?problem=1282
这个题妙在用double 来处理 前三位
这个题妙在用double 来处理 前三位
```cpp
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll qpow(ll a, ll b, ll mod)
{
ll base = a;// 2^0
ll ret = 1;
while(b)
{
if(b%2)ret=ret*base%mod;
base = base*base%mod;
b>>=1;
}
return ret;
}
ll qpow(double a, ll b, ll div)
{
double base = a;
double ret = 1;
while(b)
{
if(b%2)ret=ret*base;
base = base*base;
while(ret >=1000.0)// 每次处理 , 将ret小数点前 只保持三位
{
ret/=div;
}
while(base>=1000.0)// 每次处理 将base小数点 只保持三位
{
base/=div;
}
b/=2;
}
return (ll)ret;// 转换成整形(这样只得到 小数点前三位, 小数都被砍掉了)
}
int main()
{
int T;
cin>>T;
ll n, k;
int cnt = 0;
while(T--)
{
cin>>n>>k;
ll ans1 = qpow((double)n, k, 10);// 通过将 答案 保持在 前三位.xxx 的形似维护前三位
ll ans2 = qpow(n, k, 1000);// 通过每次 mod1000 维护后三位
cout<<"Case "<<++cnt<<": ";
printf("%lld %03lld\n", ans1, ans2);
}
return 0;
}