暑期多校联合比赛 8-24 K次方

来源:互联网 发布:miao社交软件 编辑:程序博客网 时间:2024/06/05 02:41
K次方
Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 14   Accepted Submission(s) : 7

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位数。

Sample Input

3123456 1123456 22100000056 67333

Sample Output

123...456152...936982...016

Author

shenlizhong
 
 
 
 
题目大意:求n^k次方的左右各三位数   右三位想必大伙都会做,就是取右三位,再平方,再去右三位,再平方
至于最左边三位就是    假设n^k=b*10^x        b是小于1的小数
所以  klog10(n)=log10(b)+x                           x则是整数
所以    b=10^(klog10(n)-x);                         
所以    求出b的小数点后三位即可
 
program:(偷偷贴上杨烁的代码,偷懒啊)
 
 

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std;
#define max 1000000000

char a[100];__int64 num1;double num2;


__int64 fun1(__int64 a, int n)
    {
      __int64 t;
      if(n==1) return num1;
      else {
             t=fun1(a,n/2);
             if(n%2==0)return (t*t)%1000;//(t*t才有意义取模嘛)
             else return num1*((t*t)%1000)%1000;  //等待n等于1的返回
           }       
    }
double fun2(double n,double k)
    {
           double ans;
       //    printf("pow=%lf\n",k*log10(n)-floor(k*log10(n) ) );
           ans=pow(10,k*log10(n)-floor(k*log10(n) )  );
  //         printf("ans=%lf\n",ans);
          return ans;
    }

 

int  main()
{
    __int64 result,shu1;
    double shu3,ji=10;
    int shu2,n,k,i,len,;
   
    scanf("%d",&n);
    while(n--)
    {

         scanf("%s %d",a,&k);
         len=strlen(a);
         num1=(a[len-1]-'0')+(a[len-2]-'0')*10+(a[len-3]-'0')*100;
        
         ji=1 ;
         num2=0;       
         for(i=len-1;i>=0;i--)
         {
                 num2+=(double)(a[i]-'0')*ji;         //把字符串a化成整数存在变量num2中
                 ji*=10;
         }
         shu1=fun1(num1,k);
        
        // cout<<shu1<<endl;
        
        shu3=fun2(num2,(double)(k));
        shu2=(int)(shu3*100);
      
        if(shu1<10) printf("%d...00%I64d\n",shu2,shu1);
        else if(shu1<100) printf("%d...0%I64d\n",shu2,shu1);
             else     printf("%d...%I64d\n",shu2,shu1);   
    }
   
}