E - Leading and Trailing 求n^k得前三位数字以及后三位数字,保证一定至少存在六位。

时间:2024-04-29 09:34:25
/**
题目:E - Leading and Trailing
链接:https://vjudge.net/contest/154246#problem/E
题意:求n^k得前三位数字以及后三位数字,保证一定至少存在六位。
思路:后三位求法只要不断对1000取余就行了。
前三位求法:
对一个数x,他可以用科学计数法表示为10^r*a (r为次方,1<=a<10)
设:n^k = x = 10^r*a
两边取对数: k*log10(n) = log10(x) = r+log10(a);
令y = k*log10(n); 因为r是整数,1<=a<10所以0<=log10(a)<1
所以log10(a)为y的小数部分;即log10(a) = y-(long long)y;
a = 10^(y-(long long)y);
最终结果为:(long long)(a*100)即为前三位;
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+;
///后三位
ll Least(ll n,ll k)
{
ll p = ;
while(k>){
if(k&) p = p*n%;
n = n*n%;
k >>= ;
}
return p;
}
///前三位
ll Leading(ll n,ll k)
{
double y = k*log10(n);
double a = pow(10.0,y-(ll)y);
return (ll)(a*);
}
int main()
{
int T, cas=;
ll n, k;
cin>>T;
while(T--){
scanf("%lld%lld",&n,&k);
///注意这里后三位要输出三位。
printf("Case %d: %lld %03lld\n",cas++,Leading(n,k),Least(n,k));
}
return ;
}