【CS Round #39 (Div. 2 only) C】Reconstruct Sum
给你一个数字S;
让你找有多少对A,B
满足A+B=S
然后再给你一个01串,表示某一位在算加法的时候有没有进位;
在上面的A,B中筛选出符合这个01串的A,B;
输出对数.
对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的情况,直接输出无解)
0
#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;
}