题目:http://acm.hdu.edu.cn/showproblem.php?pid=1063
emm这题就是快速幂加大数加细节了。1.0^n = 1不要带小数点。主意这个就行了。
#include<bits/stdc++.h>
#define INF 1e18
#define inf 1e9
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define IOS ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
const int _max =5050;
string mul(string s1,string s2){
int arr[_max];
memset(arr,0,sizeof(arr));
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
for(int i = 0 ; i < s1.length() ; i++)
for(int j = 0 ; j < s2.length() ; j++)
arr[i+j] += (s1[i]-'0')*(s2[j]-'0');
int len = s1.length()+s2.length();
for(int i = 0 ; i < len ; i++){
arr[i+1] += arr[i]/10;
arr[i] %= 10;
}
string ret = string(len,'0');
for(int i = 0 ; i < len ; i++)
ret[i] += arr[i];
reverse(ret.begin(),ret.end());
for(int i = 0 ; i < ret.length() ; i++){
if(ret[i] != '0'){
ret = ret.substr(i);
break;
}
}
return ret;
}
string my_pow(string x,int p){
string ret ="1";
while(p){
if(p&1) ret = mul(ret,x);
x = mul(x,x);
p>>=1;
}
return ret;
}
int main(){
IOS;
string s;
int n;
while(cin>>s>>n){
int lenx=1;
for(int i = 0 ; i < s.length() ; i++){
if(s[i] == '.'){
lenx = s.length()-i;
s = s.substr(0,i)+s.substr(i+1,s.length()-i-1);
break;
}
}
s = my_pow(s,n);
int len = s.length();
lenx = (lenx-1)*n;
if(lenx == 0){
cout<<s<<endl;
continue;
}
if(len < lenx)
s = "."+string(lenx-len,'0')+s;
else
s = s.substr(0,len-lenx)+"."+s.substr(len-lenx);
reverse(s.begin(),s.end());
for(int i = 0 ; i < s.length() ; i++){
if(s[i] != '0'){
s = s.substr(i);
break;
}
}
reverse(s.begin(),s.end());
if(s[s.length()-1] == '.') s=s.substr(0,s.length()-1);
cout<<s<<endl;
}
return 0;
}