题意:求n的k次方的前3位和后三位。
后三位直接用快速幂取下模。
前三位需要用到log维护,记得去年某个比赛就见到类似的用log保精度的问题,紫书上也遇到过,暑假的训练也碰到斐波那契前n位的问题,然后一直没看,最终区域赛热身赛也遇到这类问题,然后凉凉~~,今天又碰到了终于弄明白了QAQ。
首先任意一个数字n都可以写成(10^a)(a为浮点数);那么(n^k)就可化为(n^(ak)),我们知道在(10^a)中a可以写为x+y,其中x表示a的整数部分,y表示a的小数部分,那么x可以表示n的k次方有多少位,
(10^y)自然可以表示这个数除以10的x次方后的浮点数,因为a=log10(n),我们就可以令y=fmod(ak,1.0),然后用
pow函数求一下pow(10,y)
然后结果取前三位需要乘以100,然后取整就可以了。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int quick(int a,int b)
{
int ans=1,c=a;
while(b)
{
printf("%d\n",b%2);
if(b&1)
ans=(ans*c)%1000;
c=(c*c)%1000;
b>>=1;
}
return ans%1000;
}
int main()
{
int t;cin>>t;int cas=1;
while(t--)
{
int n,k;cin>>n>>k;
int ans1,ans2;
ans2=quick(n%1000,k);
ans1=(int)(pow(10.0,fmod(log10(1.0*n)*k,1.0))*100);
printf("Case %d: %d %03d\n",cas++,ans1,ans2);
}
return 0;
}