Time Limit: 2 second(s) | Memory Limit: 32 MB |
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 | Output for Sample Input |
5 123456 1 123456 2 2 31 2 32 29 8751919 | Case 1: 123 456 Case 2: 152 936 Case 3: 214 648 Case 4: 429 296 Case 5: 665 669 |
这个的数学思想就好玩了后几个都会求至于前几个其实我们只要找到(10)^(2+p) 直接来代表前三个数就好了后面的小数直接舍去就行了
至于怎么求神奇的p=log10(n)先求出来原来那个数是10的多少次方然后p*k就是现在
想让你求的多少次方了再后面就是直接舍去整数求10(p+2)就好了
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
typedef long long LL;
LL Qpow(int n,int m){
LL r=1; LL base=n;
while(m){
if(m&1){
r=(r*base)%1000;
}
base=base*base%1000;
m>>=1;
}
return r;
}
int main(){
int T; scanf("%d",&T); int t=1;
while(T--){
LL n; LL k;
scanf("%lld %lld",&n,&k);
printf("Case %d: ",t++);
double lp=log10(n);
lp=lp*(double)k;
LL kp=(int)lp;
lp=lp-kp;
int m = pow( 10.0, lp+2.0);
printf("%03d ",m);
LL x=Qpow(n,k);
printf("%03d\n",x);
}
return 0;
}