K次方
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 10 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
所有在程式设计已经有点经验的人都知道,当k很大时你无法完整的表达出n k。例如: C语言的函数 pow(123456,455)能够用double资料型态来表达,但是你却无法得到所有正确的数字。然而,若是能知道一些最左边(leading)和最右边(trailing)数字的话,也可稍微得到一些满足。
Input
输入的第一行有一个整数T(T < 1001),代表有几组测试资料。接下来的T行,每行有2个正整数n和k。n可以用32位元的整数表达,而k<10000001。
Output
每组测试资料输出一行,输出LLL...TTT的样式。其中LLL代表n k的最左边3个数字,TTT代表n k的最右边3个数字。例如123456 2 = 15241383936,所以你应该输出152...936。
你可以假设n k至少有6位数。
你可以假设n k至少有6位数。
Sample Input
3 123456 1 123456 2 2100000056 67333
Sample Output
123...456 152...936 982...016
以前做过类似的。
求前3位采用科学计数法两边取对数的方法。
求后3位采用二分幂取模的方法。
可是我却用了找循环节!而且还找了两个半小时!真是浪费时间啊!
#include<iostream>
#include<cmath>
using namespace std;
__int64 getansb( __int64 n,__int64 k )
{
__int64 b;
if( k==1 )
return n%1000;
if( k==0 )
return 1;
b=getansb( n,k/2 )%1000;
b=(b*b)%1000;
if( k%2==1 )
b=(b*n%1000);
return b%1000;
}
int main()
{
__int64 n,k;
int T;
scanf( "%d",&T );
while( T-- )
{
scanf( "%I64d %I64d",&n,&k );
double lo=k*log10(double(n));
double a=lo-int(lo);
a=pow(10.0,a);
while( a<1 )
a*=10;
int aa,ab,ac;
aa=int(a);
ab=int(a*10-aa*10);
ac=int(a*100-aa*100-ab*10);
printf( "%d%d%d...",aa,ab,ac );
__int64 b=getansb(n,k);
if( b<100 ) printf( "0" );
if( b<10 ) printf( "0" );
if( b==0 ) printf( "0\n" );
else printf( "%I64d\n",b );
}
return 0;
}
d