60分快速幂求条(玄关)
查看原帖
60分快速幂求条(玄关)
1110691
wuenzi楼主2024/8/8 11:58
#include<iostream>
#include<cstring>
using namespace std;
string cf(string n,string m){
	int c[100005]={};
	string ans="";
	if(n=="0"||m=="0"){
		return "0";
	}
	if(n[0]=='-'&&m[0]!='-'){
		ans+="-";
		n.erase(0,1);
	}else if(n[0]!='-'&&m[0]=='-'){
		ans+="-";
		m.erase(0,1);
	}else if(n[0]=='-'&&m[0]=='-'){
		m.erase(0,1);
		n.erase(0,1);
	}
	if(n.size()<m.size()){
		swap(n,m);
	}
	for(int i=1;i<=m.size();i++){
		for(int j=1;j<=n.size();j++){
			int q=(m[i-1]-'0')*(n[j-1]-'0');
			c[i+j-1]+=q;
		}
	}
//	cout<<c[0]<<endl;
	
	int l=m.size()+n.size();
//	for(int i=1;i<l;i++){
//		cout<<c[i]<<" ";
//	}
//	cout<<endl;
	for(int i=l-1;i>0;i--){
		c[i-1]+=c[i]/10;
		c[i]%=10;
	}
//	for(int i=0;i<l;i++){
//		cout<<c[i]<<' ';
//	}
//	cout<<endl;
	if(c[0]>0){
		int i=0;
		while(i<=l&&c[i]==0){
			i++;
		}
		if(i>l){
			return "0";
		}
		for(;i<l;i++){
			ans+=char(c[i]+'0');
		}
	}else{
		int i=1;
		while(i<=l&&c[i]==0){
			i++;
		}
		if(i>l){
			return "0";
		}
		for(int i=1;i<l;i++){
			ans+=char(c[i]+'0');
		}
	}
	return ans;
}

int cnt,q;
string k="1",a="2";
int main(){
	int n;
	cin>>n;
	while(n){
		if(n%2){
			k=cf(k,a);
		}
		a=cf(a,a);
		n>>=1;
	}
	k[k.size()-1]-=1;
	cout<<k.size();
	if(k.size()<500){
		for(int i=0;i<500-k.size();i++){
			if(i%50==0){
				cout<<endl;
			}
			cout<<0;
			cnt++;
		}
		for(int i=0;i<k.size();i++){
//		cout<<1;
		if((i+cnt)%50==0){
			cout<<endl;
		}
		cout<<k[i];
	}
	}else{
		for(int i=k.size()-500;i<k.size();i++){
//		cout<<1;
		if(q%50==0){
			cout<<endl;
		}
		cout<<k[i];
		q++;
}
}
	return 0;
}
2024/8/8 11:58
加载中...