https://vjudge.net/contest/307652#problem/E
题意
给n和k,求n的k次方的前三位和末三位
题解
后三位用快速幂对1000取模可以求。
前三位,转化对对数——令a=k*log10(n),a为double类型,其整数部分用来确定位数,小数部分确定数值。求小数部分用到cmath中的fmod函数,fmod(x,y)返回x/y的余数
输出要用%03d不然过不了
代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
ll quickmod(ll a,int b,int m)
{
ll ans=1;
a%=m;
while(b)
{
if(b&1)ans=ans*a%m;
a=a*a%m;
b=b>>1;
}
return ans;
}
int main()
{
int t,k,cnt=0;
ll n;
cin>>t;
while(t--)
{
cnt++;
cin>>n>>k;
ll hou=quickmod(n%1000,k,1000);//后三位
double tmp;
tmp=1.0*k*log10(n*1.0);
double ans=pow(10.0,fmod(tmp,1.0));
printf("Case %d: %d %03d\n",cnt,(int)(ans*100),hou);
}
return 0;
}