简直是可怕,这个题,居然是用double。。
简直是神操作,是我太思维僵化了;居然想着只取前四位然后乘,寻找循环规律;
题目网址点击打开链接
对于前三位abc的求法,让我直接饮用大佬的解析
后三位直接用快数幂取余可以求出
前三位我们可以将n^k转化成a.bc * 10^m,这样abc就是前三位了,n^k = a.bc * 10^m
即lg(n^k) = lg(a.bc * 10^m)
<==>k * lg(n) = lg(a.bc) + lg(10^m) = lg(a.bc) + m
m为k * lg(n)的整数部分,lg(a.bc)为k * lg(n)的小数部分
x = lg(a.bc) = k * lg(n) - m = k * lg(n) - (int)(k * lg(n))
a.bc = pow(10, x);
abc = a.bc * 100;
这样前三位数abc便可以求出
#include <iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int Pow(int x,int y)
{
int res=1;
x=x%1000;
while(y>0)
{
if(y&1)
res=(res*x)%1000;
x=(x*x)%1000;
y/=2;
}
return res;
}
int main()
{
// cout<<Pow(2,2)<<endl;
//cout << "Hello world!" << endl;
int t;
cin>>t;
for(int k=1;k<=t;k++)
{
int a,b;
cin>>a>>b;
double m=(double)b*log10(a)-(int)(b*log10(a));
m=pow(10,m);
int x=m*100;
int y=Pow(a,b);
cout<<"Case "<<k<<": ";
printf("%d %03d\n",x,y);
}
return 0;
}
太强了了了了了了了了了!!!!!!,完全没想到还可以这样搞,真的是 我傻