E - Leading and Trailing
题目链接:https://vjudge.net/problem/LightOJ-1282#author=yyb
题目大意:
给定两个数n,k 求n^k的前三位和最后三位。
解题思路:
$b = a^{n}$ 可以推出 $10^{nlog_{10}a} = b$. 然后计算n*log10(a),他可能大于1所以对1取余得到k,然后计算pow(10,2+k),得到前三位即可。
后三位ksm对1000取余就能得到。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define debug(a) cout<<#a<<":"<<a<<endl; 4 typedef long long ll; 5 const int mod=1e3; 6 int maxn,minn; 7 int T,n; 8 ll ksm(ll a,ll b){ 9 ll ans=1; 10 while(b){ 11 if(b&1){ 12 ans=ans*a%mod; 13 } 14 a=a*a%mod; 15 b>>=1; 16 } 17 return ans; 18 } 19 20 int main(){ 21 ll a,b,c; 22 ll a1,a2,num=0; 23 cin>>T; 24 while(T--){ 25 num++; 26 cin>>a>>b; 27 a1=pow(10,2+fmod((double)b*log10(a),1)); 28 while(a1>1000){ 29 a1/=10; 30 } 31 a2=ksm(a,b); 32 printf("Case %d: %03lld %03lld ",num,a1,a2); 33 } 34 35 return 0; 36 }