UVA-113
题意:给p和n,求一个数k,使得k^n = p;
解题思路:二分枚举k,利用高精度计算k^n,和p比较。然后听说用double就可以了?
/*************************************************************************
> File Name: UVA-113.cpp
> Author: Narsh
>
> Created Time: 2016年07月13日 星期三 14时59分08秒
************************************************************************/
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,k,ansl,nl,ans[300],z[300],p[300],lp,ta[300];
string s;
int main (){
while (scanf("%d",&n)!=EOF){
memset(ans,0,sizeof(ans));
cin>>s;
ansl=1;
ans[ansl]=0;
int ss=1;
for (int i=s.length()-1,t=0;i>=0;i--){
ans[ansl]+=(s[i]-'0')*ss;
ss*=10;
t++;
if (t==4){
t=0;
ss=1;
ansl++;
}
}
while (ans[ansl]==0)ansl--;
int lef=2,rig=1000000010;
while (lef<rig){
int mid=(lef+rig)/2;
nl=0;
memset(z,0,sizeof(z));
while (mid){
nl++;
z[nl]=mid%10000;
mid/=10000;
}
memset(p,0,sizeof(p));
lp=1;p[1]=1;
for (int gg=1;gg<=n;gg++){
memset(ta,0,sizeof(ta));
for (int i=1;i<=lp;i++)
for (int j=1;j<=nl;j++){
ta[i+j-1]+=p[i]*z[j];
ta[i+j]+=(ta[i+j-1]/10000);
ta[i+j-1]%=10000;
}
lp=lp+nl;
for (int i=1;i<=lp;i++)
p[i]=ta[i];
while (p[lp]==0)lp--;
}
bool tag=true;
if (lp>ansl) {
rig=(lef+rig)/2-1;
tag=false;
} else if (lp<ansl){
lef = (lef+rig)/2+1;
tag=false;
}else {
for (int i=lp;i>=1;i--)
if (ans[i]<p[i]){
rig=(lef+rig)/2-1;
tag=false;
break;
}else if (ans[i]>p[i]){
lef = (lef+rig)/2+1;
tag=false;
break;
}
}
if (tag) {
break;
}
}
cout<<(lef+rig)/2<<endl;
}
}