11029 - Leading and Trailing
Time limit: 3.000 seconds
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1970
Apart from the novice programmers, all others know that you can’t exactly represent numbers raised to some high power. For example, the C function pow(125456, 455) can be represented in double data type format, but you won’t get all the digits of the result. However we can get at least some satisfaction if we could know few of the leading and trailing digits. This is the requirement of this problem.
Input
The first line of input will be an integer T<1001, where T represents the number of test cases. Each of the next T lines contains two positive integers, n and k. n will fit in 32 bit integer and k will be less than 10000001.
Output
For each line of input there will be one line of output. It will be of the format LLL…TTT, where LLL represents the first three digits of n^k and TTT represents the last three digits of n^k. You are assured that n^k will contain at least 6 digits.
Sample Input | Output for Sample Input |
2 123456 1 123456 2 | 123...456 152...936 |
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long ll;
const int mod=1000;
const int M=1000000000;
const int N=0x7fffffff;
ll mi (int n,int m)
{
if (m==1) return n%mod;
if (m%2==0)
return (mi(n,m/2)%1000)*(mi(n,m/2)%mod)%mod;
else
return n*mi(n,m/2)*mi(n,m/2)%mod;
}
double mi2(int n,int m)
{
if (m==0) return 1.0;
double s=mi2(n,m/2)*mi2(n,m/2);
if (m%2)
s*=n;
while (s>M) s/=M;
return s;
}
int main()
{
int t;
cin>>t;
while (t--)
{
int n,k;
cin>>n>>k;
int b=mi(n,k)%mod;
double c=mi2(n,k);
//cout<<c<<endl;
while (c>=1000) c/=10;
int d=c*1000;
while (d>=1000) d/=10;
printf("%d...%03d\n",d,b);
}
}