专栏文章

题解:CF625D Finals in arithmetic

CF625D题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min4k73w
此快照首次捕获于
2025/12/01 20:27
3 个月前
此快照最后确认于
2025/12/01 20:27
3 个月前
查看原文
不知道为啥其他题解的代码如此长。
下设 ss 为数,n=len(s)n=len(s)
有两种情况:
  • len(a)=nlen(a)=n。那么 a1+ana_1+a_n 没有进位。因此通过 sns_n 得出了他们的和。如果现在 s1=sns_1=s_n,说明 a2+an1a_2+a_{n-1} 没有进位,否则进了,……,以此类推。
  • len(a)=n1len(a)=n-1。类似的,a1+ana_1+a_n 进位了。也可以依次递推。
CPP
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 1e5+5;

int n,a[N],b[N],c[N];
string s;

bool chk(int len){
    if (b[1]==0) return 0;
    for (int i=1; i<=len; i++){
        if (!(0<=b[i] && b[i]<=9)) return 0;
    }
    for (int i=1; i<=len; i++){
        c[i]=b[i]+b[len-i+1];
    }
    for (int i=len; i; i--){
        if (c[i]>=10){
            c[i-1]+=c[i]/10;
            c[i]%=10;
        }
    }
    for (int i=1; i<=n; i++){
        if (c[i-(n-len)]!=s[i]-'0') return 0;
    }
    return 1;
}

void sol(int len){
    int l=1,r=len;
    while (l<=r){
        if (a[l]>=a[r]+10){
            a[r]+=10;
            a[r-1]--;
        }
        if (a[l]==a[r]+1){
            a[l]--;
            a[l+1]+=10;
        }
        if (a[l]!=a[r]){
            return;
        }
        if (l==r && a[l]%2){
            return;
        }
        int x=(a[l]+1)/2;
        b[l]=x;
        b[r]=a[l]-x;
        l++,r--;
    }
    if (chk(len)){
        for (int i=1; i<=len; i++){
            cout<<b[i];
        }
        cout<<"\n";
        exit(0);
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>s;
    n=s.size();
    s=" "+s;
    for (int i=1; i<=n; i++){
        a[i]=s[i]-'0';
    }
    sol(n);
    if (s[1]=='1' && n!=1){
        for (int i=1; i<n; i++){
            a[i]=s[i+1]-'0';
        }
        a[1]+=10;
        sol(n-1);
    }
    cout<<"0\n";
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...