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

时间:2023-03-10 07:24:22
【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\n",ans);
return 0;
}