POJ 2109 Power of Cryptography(내 수제의 길--k^n=p)

Power of Cryptography
Time Limit: 1000MS
 
Memory Limit: 30000K
Total Submissions: 12137
 
Accepted: 6206
Description
Current work in cryptography involves (among other things) large prime numbers and computing powers of numbers among these primes. Work in this area has resulted in the practical use of results from number theory and other branches of mathematics once considered to be only of theoretical interest. 
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
The input consists of a sequence of integer pairs n and p with each integer on a line by itself. For all such pairs 1<=n<= 200, 1<=p<10
101 and there exists an integer k, 1<=k<=10
9 such that k
n = p.
Output
For each integer pair n and p the value k should be printed, i.e., the number k such that k n =p.
Sample Input
2 16
3 27
7 4357186184021382204544

Sample Output
4
3
1234

Source
México and Central America 2004
식자 k^n=p에 대해 문제에서 n과 p를 제시하고 k를 구한다.
이 문제는 처음에 생각한 것은 math의 함수 pow(m, n), 즉 m^n의 값을 구할 수 있다는 것이다.전에 그가 처방전을 써본 적이 있어서 생각났어요. 게다가 디스커스에 있는 힌트를 보고 바로 pow(m, 1/n)로 값을 구했어요. 그런데 이상하게도 WA가 여러 번 있었어요. 원인을 전혀 찾지 못해서 몇 명의 AC코드를 찾아서 붙여넣었어요. 계속 WA를 할 방법이 없을 것 같아요.POJ 관리자가 데이터를 강하게 바꿨다고 의심스러워요.그 후로는 이분법으로 값을 구할 방법이 없었다.
코드(2분법 1AC):
#include <cstdio>
#include <cstdlib>
#include <cmath>

int main(void){
    double n, m;
    long long left, right, mid;

    while(scanf("%lf%lf",&n,&m)!=EOF){
        left = 0;
        right = 1000000002;
        while (right - 0.00000001 > left){
            mid = (left + right) / 2;
            if (pow(mid, n) - m > 0){
                right = mid;
            }
            else if (pow(mid, n) - m < 0){
                left = mid;
            }
            else{
                printf("%.0lld
", mid); break; } } } return 0; }

파워 함수로 된 코드도 붙여주세요. 멋있는 건 AC가 안 돼요.(1CE 4WA):
#include<stdio.h>
#include<math.h>

int main()
{
    double n, m;
    while(scanf("%lf%lf", &n, &m) != EOF)
        printf("%.0lf
" ,pow(m, 1 / n)); return 0; }

좋은 웹페이지 즐겨찾기