Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 16238 | Accepted: 8195 |
Description
This problem involves the efficient computation of integer roots of numbers.
Given an integer n>=1 and an integer p>= 1 you have to write a program that determines the n th positive root of p. In this problem, given such integers n and p, p will always be of the form k to the n th. power, for an integer k (this integer is what your program must find).
Input
Output
Sample Input
2 16 3 27 7 4357186184021382204544
Sample Output
4 3 1234
Source
México and Central America 2004
题意:给一对数 n(1<=n<=200)和p(1<=p<=10^101),求k使k^n=p。
分析:1、很自然的,因为觉得数据很大,会去想高精度。然后加二分猜数。
然后不会高精度啊。。
2、于是想到转换数学运算:指对互化。用double存,但是double 精确位只有6—7。而没有logx Y,只有先转化为以e为底的对数。用lognP=logn/logP。用两次函数,
精确度不能满足要求。
3、换思路:k^n=p,则p^(1/n)=k。且函数可以直接用pow(x,y)去求x^y。
收获:巩固了一下基础。启发了一下思维。
类型 长度 (bit) 有效数字 绝对值范围
float 32 6~7 10^(-37) ~ 10^38
double 64 15~16 10^(-307) ~10^308
long double 128 18~19 10^(-4931) ~ 10 ^ 4932
代码:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double n,p;
while(scanf("%lf%lf",&n,&p)!=EOF)
{
printf("%.0lf\n",pow(p,1/n));
}
return 0;
}
11922275 | Accepted | 192K | 0MS | 221B | 2013-08-05 11:12:30 |