1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <cstdio>
#include <cstdlib>

//using namespace std;

int main()
{
const int N = 1e6;
char *D1,*D2,*S;
long long int n,r,c,p,s,i;

	D1 = (char*) malloc((N+1)*sizeof(char));
	D2 = (char*) malloc((N+1)*sizeof(char));
	S = (char*) malloc((N+1)*sizeof(char));
	
	scanf("%s",D1);
	scanf("%s",D2);
	scanf("%s",S);
	
	n = r = c = s = 0;
	while (S[n])
	{
		n++;
	}
	n--;

	for (; n >= 0; n--)
	{
		if (c + D1[n] - '0' + D2[n] - '0' == S[n] - '0')
		{
			c = 0; //carrier = 0
			s++;
//			printf("succ: n=%lld r=%lld c=%lld s=%lld : %lld + %d + %d == %d\n",n,r,c,s,c,D1[n]-'0',D2[n]-'0',S[n]-'0');
		}
		else if ((c + D1[n] - '0' + D2[n] - '0') % 10 == S[n] - '0')
		{
			c = 1;
//			printf("part: n=%lld r=%lld c=%lld s=%lld : %lld + %d + %d = 1%d\n",n,r,c,s,c,D1[n]-'0',D2[n]-'0',S[n]-'0');
		}
		else if (D1[n] - '0' + D2[n] - '0' == S[n] - '0')
		{
			r += (s * (s + 1)) >> 1;
			s = 1;
			c = 0;
//			printf("nsucc: n=%lld r=%lld c=%lld s=%lld : %d + %d != %d\n",n,r,c,s,D1[n]-'0',D2[n]-'0',S[n]-'0');
		}
		else if ((D1[n] - '0' + D2[n] - '0') % 10 == S[n] - '0')
		{
			r += (s * (s + 1)) >> 1;
			s = 0;
			c = 1;
//			printf("npart: n=%lld r=%lld c=%lld s=%lld : %d + %d != 1%d\n",n,r,c,s,D1[n]-'0',D2[n]-'0',S[n]-'0');			
		}
		else
		{
			r += (s * (s + 1)) >> 1;
			s = 0;
			c = 0;
//			printf("fail: n=%lld r=%lld c=%lld s=%lld : %d + %d != %d\n",n,r,c,s,D1[n]-'0',D2[n]-'0',S[n]-'0');
		}
	}
	r += (s * (s + 1)) >> 1;
	printf("%lld\n",r);
	fflush(stdout);

	free(D1);
	free(D2);
	free(S);
	
	return 0;
}