求n^k前三位,后三位
前三位用10^x=n^k x = log10(N^k) = k*log10(N) = a(整数部分)+b(小数部分)
//求一个数 p 的小数部分 y=modf(p,&q) ,整数部分存到 q
后三位直接用 快速幂 求得 (模板)
You are given two integers: n and k, your task is to find the most significant three digits, and least significant three digits of nk.
Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.
Each case starts with a line containing two integers: n (2 ≤ n < 231) and k (1 ≤ k ≤ 107).
Output
For each case, print the case number and the three leading digits (most significant) and three trailing digits (least significant). You can assume that the input is given such that nk contains at least six digits.
Sample Input
5 123456 1 123456 2 2 31 2 32 29 8751919
Sample Output
Case 1: 123 456 Case 2: 152 936 Case 3: 214 648 Case 4: 429 296 Case 5: 665 669
#include<bits/stdc++.h>
#define ll long long
using namespace std;
double x,y;
ll fir,res;
//快速幂 求后三位
ll binarypow(ll a,ll b)
{
ll ans=1;
while(b>0)
{
if(b&1)
ans=ans*a%1000;
a=a*a%1000;
b>>=1;
}
return ans;
}
int main()
{
int t;
ll n,k;
cin>>t;
int cnt=1;
while(t--)
{
cin>>n>>k;
res=binarypow(n,k);//快速幂 求后三位
y=modf((double)(k*log10(n)),&x);// modf(p,&q) 函数求 小数部分y
//n^k = 10^小数部分 * 10^整数部分 = 10^( 整数部分 + 小数部分 )
fir=pow(10,y)*100;// 前三位 10^y*100
printf("Case %d: %lld %03lld\n",cnt++,fir,res);
}
return 0;
}