代码:
#include<bits/stdc++.h>
using namespace std;
string n;
#define M 1000005
int qq;
int a[M],b[M],c[3000000];
string mul(string n_a,string n_b){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
int l1=0,l2=0;
for(int i=n_a.size()-1;i>=0;i--){
a[++l1]=n_a[i]-'0';
}
for(int i=n_b.size()-1;i>=0;i--){
b[++l2]=n_b[i]-'0';
}
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
int w=i+j-1;
c[w]+=a[i]*b[j];
if(c[w]>9){
c[w+1]+=c[i+j-1]/10;
c[w]%=10;
}
}
}
int l=l1+l2-1;
if(c[l1+l2]!=0)
l++;
string ans="";
for(int i=l;i>0;i--){
ans=ans+((char)(c[i]+'0'));
}
return ans;
}
string div(string A,int n_b){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
qq=0;
int w;
string ans="";
for(int i=0;i<A.size();i++){
qq=qq*10+(A[i]-48);
w=qq/n_b;
ans+=(char)(w+48);
qq=qq%n_b;
}
if(ans.size()>1){
while(ans[0]=='0'){
ans.erase(0,1);
}
}
return ans;
}
string ksm(string b){
if(b=="1") return "2";
if(b=="0") return "1";
string h=ksm(div(b,2));
if(qq!=1) return mul(h,h);
else return mul(mul(h,h),"2");
}
int main(){
cin>>n;
string ans="1";
ans=ksm(n);
ans[ans.size()-1]=ans[ans.size()-1]-1;
cout<<ans;
return 0;
}
评测结果:
