【CS Round #39 (Div. 2 only) C】Reconstruct Sum

Link:https://csacademy.com/contest/round-39/task/reconstruct-sum/

Description

给你一个数字S;
让你找有多少对A,B
满足A+B=S
然后再给你一个01串,表示某一位在算加法的时候有没有进位;
在上面的A,B中筛选出符合这个01串的A,B;
输出对数.

Solution

对S的每一位考虑;
从后往前
如果该位x的后一位进了一位到这一位;
则两个加数在这一位上的需要的数字为x=x-1,否则仍为x
然后看看这一位会不会产生进位;
如果产生了进位;
把x加上10;
即x+=10
我们考虑A在这一位的数字;
假设是t

0<=t<=9
0<=x-t<=9
则有
x-9<=t<=x
对x 分类讨论;

x>=10

x-9<=t<=9
x<=9

0<=t<=x;
乘法原理做一下就好;
(对于x<0的情况,直接输出无解)

NumberOf WA

0

Reviw


Code

#include <bits/stdc++.h>
#define int long long

char s1[20],s2[20];
int a1[20],a2[20];
int len;

main(){
    scanf("%s",s1+1);
    len = strlen(s1+1);
    for (int i = 1;i <= len;i++)
        a1[i] = s1[i]-'0';
    for (int i = 1;i <= len-1;i++)
        scanf("%lld",&a2[i]);
    a2[len] = 0;
    int x = 0,ans = 1;
    for (int i2 = 1,i1 = len;i2 <= len;i2++,i1--){
        int temp;
        temp = a1[i1]-x;
        if (a2[i2]==1) {
            temp+=10;
            x = 1;
        }else x = 0;
        if (temp<0) return puts("0"),0;
        if (temp <= 9)
            ans = ans*(temp+1);
        else
            ans = ans*(9-(temp-9)+1);
    }
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626158.html