社区讨论
求助今晚abc F
学术版参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhjtnfbi
- 此快照首次捕获于
- 2025/11/04 08:19 4 个月前
- 此快照最后确认于
- 2025/11/04 08:19 4 个月前
WA两个点,找不到了,求助各位大佬
CPP#include<bits/stdc++.h>
#define int long long
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define mid ((l+r)>>1)
#define lowbit(x) ((x)&-(x))
#define pii pair<int,int>
#define mk make_pair
using namespace std;
const int N=2e3+5,INF=1e9+7;
int n,m,T;
int f[N][2];
bool ok[N];
string s[N];
vector<int> g[N];
void init(){
s[1]="1",s[11]="11",s[111]="111",s[1111]="1111";
f[1][0]=f[1][1]=1;
f[11][0]=f[11][1]=2;
f[111][0]=f[111][1]=3;
f[1111][0]=f[1111][1]=4;
ok[1]=ok[11]=ok[111]=ok[1111]=1;
for(int i=2;i<=2000;i++){
for(int j=i*2;j<=2000;j+=i) g[j].push_back(i);
}
}
struct node{
int x,y;
}to[N];
void dfs(int n){
if(ok[n]) return;
if(n>1) {
dfs(n-1);
if(1+f[n-1][0]+1<f[n][0]) {
f[n][0]=1+f[n-1][0]+1;
to[n]=node{n-1,1};
f[n][1]=f[n][0]+2;
}
}
if(n>11){
dfs(n-11);
if(2+f[n-11][0]+1<f[n][0]) {
f[n][0]=2+f[n-11][0]+1;
to[n]=node{n-11,11};
f[n][1]=f[n][0]+2;
}
}
if(n>111){
dfs(n-111);
if(3+f[n-111][0]+1<f[n][0]) {
f[n][0]=3+f[n-111][0]+1;
to[n]=node{n-111,111};
f[n][1]=f[n][0]+2;
}
}
if(n>1111){
dfs(n-1111);
if(4+f[n-1111][0]+1<f[n][0]) {
f[n][0]=4+f[n-1111][0]+1;
to[n]=node{n-1111,1111};
f[n][1]=f[n][0]+2;
}
}
for(int j:g[n]){
dfs(j);dfs(n/j);
if(f[j][1]+f[n/j][1]+1<=f[n][0]) {
f[n][0]=f[j][1]+f[n/j][1]+1;
to[n]=node{j,n/j};
f[n][1]=f[n][0];
}
// cerr<<j<<' '<<n/j<<"\n";
}
// f[n][1]=f[n][0]+2;
// if(n==12){
// cerr<<f[n][0]<<' '<<f[n][1]<<'\n';
// }
ok[n]=1;
}
void print(int n,bool ok){
int x=to[n].x,y=to[n].y;
if(n==1||n==11||n==111||n==1111){
cout<<s[n];
return;
}
if(ok) cout<<'(';
if(n==x*y) {
print(x,f[x][0]!=f[x][1]);
cout<<"*";
print(y,f[y][0]!=f[y][1]);
}
else {
print(x,0);
cout<<"+";
print(y,0);
}
if(ok) cout<<')';
return;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
for(int i=1;i<=2000;i++) f[i][0]=f[i][1]=INF;
init();
cin>>m;
dfs(m);
print(m,0);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...