0 pts 求助
查看原帖
0 pts 求助
1288162
Liyhzh_Diary楼主2024/4/30 18:05

马蜂丑,请轻喷。

我的思路就再题解区里面,可以去看。

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;

typedef long long ll;
typedef double db;
typedef __int128 III;
const db eqs=1e-6;
const int inf=1e9;
void cmax(int &a,int b){a=max(a,b);}
void cmin(int &a,int b){a=min(a,b);}
bool db_eq(db a,db b){return fabs(a-b)<eqs;}

const int MAXN=10000+5;
string s; 
vector<int>a,b;
vector<int>st;
int c[MAXN][MAXN];

void clean1(){while(!a.empty()) a.pop_back();}
void clean2(){while(!b.empty()) b.pop_back();}

int div()
{
//	cout<<"514"<<endl;
	int yu=0,id,cur=-1;
	int len=a.size(),x=0;
	if(a.size()==1 && a[0]==1)
	{
		a[0]=0;
		return 1;
	}
	if(a.size()==1 && a[0]==2)
	{
		a[0]=0;
		return 2;
	}
	for(int i=0;i<len;i++)
	{
		if(x*10+a[i]>=3) 
		{
			id=i;
			break;
		}
		x=x*10+a[i];
	}
	yu=x;
//	cout<<id<<" "<<x<<" ";
	for(int i=id;i<len;i++)
	{
		b.push_back((a[i]+yu*10)/3);
		yu=(yu*10+a[i])%3;
	}
//	cout<<yu<<endl;
	clean1();
	for(int i=0;i<b.size();i++) a.push_back(b[i]);
	clean2();
	return yu;
}

void power()
{
	c[0][1]=1,c[0][2]=-1;
	for(int i=1;i<st.size();i++)
	{
		int id;
		for(int j=1;;j++) 
		{
			if(c[i-1][j]==-1) 
			{
				id=j-1;
				break;
			}
		}
//		cout<<id<<endl;
		for(int j=id;j>=1;j--)
		{
			c[i][j]+=c[i-1][j]*3;
			if(c[i][j]>=10) c[i][j-1]+=c[i][j]/10,c[i][j]%=10;
		}
		if(c[i][0]>0)
		{
			for(int j=id;j>=0;j--) c[i][j+1]=c[i][j];
			c[i][id+2]=-1;
			c[i][0]=0;
		}
		else c[i][id+1]=-1;
	}
}

void print()
{
	for(int i=0;i<a.size();i++) cout<<a[i];
	cout<<endl;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>s;
//	cout<<s<<endl;
	int len=s.size();
	for(int i=0;i<len;i++) a.push_back(s[i]-'0');
//	print();
	while(a[0]!=0)
	{
		st.push_back(div());
//		print();
//		cout<<114<<endl;
	}/*
	while(!st.empty())
	{
		cout<<st.top()<<" ";
		st.pop();
	}
	cout<<endl;*/
	power();/*
	cout<<st.size()<<endl;
	for(int i=0;i<st.size();i++) 
	{
		cout<<i<<" ";
		for(int j=1;;j++)
		{
			if(c[i][j]==-1)
			{
				cout<<endl;
				break;
			}
			cout<<c[i][j];
		}
	}*/
//	for(int i=0;i<st.size();i++) cout<<st[i]<<" ";cout<<endl;
	cout<<0<<endl;
	for(int i=0;i<st.size();i++)
	{
		int x=st[i];
		if(x==0) continue;
		if(x==1)
		{
			for(int j=1;;j++)
			{
				if(c[i][j]==-1)
				{
					cout<<" ";
					break;
				}
				cout<<c[i][j];
			}
		}
		else
		{
			for(int j=1;;j++)
			{
				if(c[i][j]==-1)
				{
					cout<<" ";
					break;
				}
				cout<<c[i][j];
			}
			for(int j=1;;j++)
			{
				if(c[i][j]==-1)
				{
					cout<<" ";
					break;	
				}
				cout<<c[i][j];
			}
		}
	}
	return 0;
}


2024/4/30 18:05
加载中...