方法1
p直接开n次方
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <string>
#include <algorithm>
#define N 1010
#define ll long long
using namespace std;
int main(){
#ifndef ONLINE_JUDGE
freopen("1.txt", "r", stdin);
#endif
double n, p;
while(cin >> n >> p) {
cout << pow(p, 1.0/n) << endl;
}
return 0;
}
方法2
二分+大数相乘
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <cstring>
#include <string>
#include <algorithm>
#define N 500
#define ll long long
#define base 10000
using namespace std;
int n, a1[N], a2[N];
void mul(int a[], int len, ll b){
ll i, carry = 0;
for (i = len-1; i >= 0; i--){
carry += a[i]*b;
a[i] = carry%base;
carry /= base;
}
}
char s[110];
int main(){
#ifndef ONLINE_JUDGE
freopen("1.txt", "r", stdin);
#endif
int i, j, l, t;
ll left, right, mid;
while(~scanf("%d%s", &n, s)){
l = strlen(s);
memset(a1, 0, sizeof(a1));
for (i = l-1, j = N-1; i >= 3; i-=4, j--){
a1[j] = (s[i]-'0') + 10*(s[i-1]-'0') + 100*(s[i-2]-'0') + 1000*(s[i-3]-'0');
}
t = 1;
while(i >= 0){
a1[j] += t*(s[i]-'0');
t *= 10;
i--;
}
left = 1;
right = 1000000000;
while(left <= right) {
mid = (left+right)>>1;
memset(a2, 0, sizeof(a2));
a2[N-1] = 1;
for (i = 0; i < n; i++){
mul(a2, N, mid);
}
for (i = 0; i < N; i++){
if (a1[i] < a2[i]){
right = mid-1;
break;
}else if (a1[i] > a2[i]){
left = mid+1;
break;
}
}
if (i == N){
break;
}
}
cout << mid << endl;
}
return 0;
}