暑期多校联合比赛 8-24 K次方
2012-08-24 21:08
253 查看
K次方
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 14 Accepted Submission(s) : 7
你可以假设n k至少有6位数。
题目大意:求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);
}
}
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
3 123456 1 123456 2 2100000056 67333
Sample Output
123...456 152...936 982...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);
}
}
相关文章推荐
- 暑期多校联合比赛F题 8_24 杨辉三角的打印
- 多校联合比赛部分题目
- 暑期多校联合第一题,hdu4861
- 2013暑期多校联合训练\第三场\Problem H
- 2013暑期多校联合训练\第三场\Problem G
- 2013暑期多校联合训练\第四场\Problem H Hehe
- HDU 4643 GSM 暑期多校联合训练第五场 1001
- 2013暑期多校联合训练\第五场 Problem F Magic Pen 6
- 暑期第一次多校联合赛 I题 数学题
- 暑期多校联合第一场 H题 俄罗斯方块 (整理暑期题目系列)
- 2009ACM多校联合暑期集训(2)——TJU专场
- 2012 多校联合比赛第二场
- 2012暑假集训多校联合比赛安排说明(新)欢迎各位提出宝贵意见
- HDU 4643 GSM 暑期多校联合训练第五场 1001
- 多校联合比赛总结(2012-7-31)
- 多校联合比赛总结(四)
- 2009ACM多校联合暑期集训(5)——国防科大专场
- 2018年全国多校算法寒假训练营练习比赛(第五场) (树状数组模板)
- 2018年全国多校算法寒假训练营练习比赛(第五场)G-Tree Recovery
- 2018年全国多校算法寒假训练营练习比赛(第五场) A 逆序数 树状数组 离散化