题很简单 求 n^k 前3项和后三项
后三项不需要想就知道是快速幂了
但是前三项需要推一下
我们知道任意数可以转化成 X = 10^( x + y ) (x为整数,y为小数)
其中 10^x 来控制的是源数字 *10 *100.。。这样的东西,而具体这个数字等于多少,全靠10^y ,
那么 我们就可知道 10^y 就是我们要求的前n个数字还不会炸 long long (用double的话末尾消去,很适合)
这样我们就能保证前7位可知, 如果要前三位 只需要 10^(y) * 100 就好了。
由于这道题数据卡的不是太死。。限时 2s ,那么不用快速幂去搞前三位。。似乎没事。
fmod 是一个特殊函数 fmod(a,b) (a , b 为 浮点型) 得出的结果是 a / b 得出的结果的小数。。
距离 fmod( 4, 3 ) 结果为 0.3333333 ,那么我们这样 fmod( x , 1 ) 就是默认取他的小数点位
那么 对于 X^k = 10^x * 10^y
x + y = k * lg X ,那么 y = fmod( k*lg X, 1.0 )
然后再*100就是前三位了。。。
以下是 AC 代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int mod = 1e3;
ll qpow(ll a,ll n)
{
ll res = 1;
while(n)
{
if(n&1)
res = (res*a)%mod;
a = (a*a) % mod;
n >>= 1;
}
return res;
}
int fin,pre;
ll n,k;
int main()
{
int t,cas = 1;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&k);
fin = qpow(n%mod,k);
pre = pow(10.0,fmod(k*log10(n*1.0), 1))*100;
printf("Case %d: %d %03d\n",cas++,pre,fin);
}
return 0;
}