数据过水?
查看原帖
数据过水?
935574
dulinfan2023楼主2025/1/27 09:43

O(log10nO(\log_{10}n a2b2)a^2b^2) 过了 \cdots

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define debug() cout<<"come on"<<'\n'
#define mkp make_pair
string n;
int a,b;
string dp[105][105];
string dx(string a,string b){
	if(a.length()!=b.length())return a.length()>b.length()?a:b;
	return a>b?a:b;
}
map<pair<char,int>,char> mp1,mp2;
signed main(){
	cin>>n>>a>>b;
	for(char i='0';i<='8';i++)mp1[mkp(i,1)]=i+1;
	mp1[mkp('9',1)]='0';
	for(char i='1';i<='9';i++)mp2[mkp(i,1)]=i-1;
	mp2[mkp('0',1)]='9';
	for(char i='0';i<='9';i++){
		for(int p=2;p<=18;p++){
			char x=mp1[mkp(i,p-1)],xx=mp2[mkp(i,p-1)];
			mp1[mkp(i,p)]=mp1[mkp(x,1)];
			mp2[mkp(i,p)]=mp2[mkp(xx,1)];
		}
	}
	for(int i=0;i<=a;i++){
		for(int j=0;j<=b;j++){
			dp[i][j]="";
		}
	}
	dp[0][0]=n;
	for(int i=0;i<=a;i++){
		for(int j=0;j<=b;j++){
			for(int k=0;k<dp[i][j].size();k++){
				for(int ci=1;ci<=a-i;ci++){
					string x=dp[i][j];
					x[k]=mp1[mkp(x[k],ci)];
					dp[i+ci][j]=dx(dp[i+ci][j],dx(x,dp[i][j]));
//					cout<<"i "<<i<<" "<<ci<<" "<<dp[i][j]<<" "<<k<<" "<<x<<'\n';
				}
				for(int ci=1;ci<=b-j;ci++){
					string x=dp[i][j];
					x[k]=mp2[mkp(x[k],ci)];
					dp[i][j+ci]=dx(dp[i][j+ci],dx(x,dp[i][j]));
//					cout<<"j "<<j<<" "<<ci<<" "<<dp[i][j]<<" "<<k<<" "<<x<<'\n';
				}
			}
		}
	}
	cout<<dp[a][b];
	return 0;
}
2025/1/27 09:43
加载中...