#include <iostream>
#include <string>
#include <cstdint>
using namespace std;
static const int SIZE = 1 << 20;
static string sA, sB, sC;
static size_t iSize;
static int8_t a[SIZE];
static int8_t b[SIZE];
static int8_t c[SIZE];
static int64_t aDP[SIZE][4]; // [right position][carry]
static void PrepareTables()
{
for (size_t i = 0; i < iSize; ++i)
{
a[i] = sA[i] - '0';
b[i] = sB[i] - '0';
c[i] = sC[i] - '0';
}
}
static void FillTable()
{
int64_t m;
for (int iCarry = 0; iCarry < 4; ++iCarry)
{
int k = a[0] + b[0] + iCarry;
aDP[0][iCarry] = (k == c[0]) ? 1 : 0;
}
for (size_t iPos = 1; iPos < iSize; ++iPos)
{
for (int iCarry = 0; iCarry < 4; ++iCarry)
{
int k = a[iPos] + b[iPos] + iCarry;
if ((k % 10) != c[iPos])
{
aDP[iPos][iCarry] = 0;
continue;
}
m = (k < 10) ? 1 : 0;
m += aDP[iPos - 1][k / 10];
aDP[iPos][iCarry] = m;
}
}
}
static int64_t GetResult()
{
int64_t iRes = 0;
for (size_t iPos = 0; iPos < iSize; ++iPos)
{
iRes += aDP[iPos][0];
}
return iRes;
}
int main()
{
// freopen("sample_input.txt", "r", stdin);
// freopen("sample_output.txt", "w", stdout);
cin >> sA >> sB >> sC;
iSize = sC.length();
PrepareTables();
FillTable();
int64_t iRes = GetResult();
cout << iRes;
}
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <iostream> #include <string> #include <cstdint> using namespace std; static const int SIZE = 1 << 20; static string sA, sB, sC; static size_t iSize; static int8_t a[SIZE]; static int8_t b[SIZE]; static int8_t c[SIZE]; static int64_t aDP[SIZE][4]; // [right position][carry] static void PrepareTables() { for (size_t i = 0; i < iSize; ++i) { a[i] = sA[i] - '0'; b[i] = sB[i] - '0'; c[i] = sC[i] - '0'; } } static void FillTable() { int64_t m; for (int iCarry = 0; iCarry < 4; ++iCarry) { int k = a[0] + b[0] + iCarry; aDP[0][iCarry] = (k == c[0]) ? 1 : 0; } for (size_t iPos = 1; iPos < iSize; ++iPos) { for (int iCarry = 0; iCarry < 4; ++iCarry) { int k = a[iPos] + b[iPos] + iCarry; if ((k % 10) != c[iPos]) { aDP[iPos][iCarry] = 0; continue; } m = (k < 10) ? 1 : 0; m += aDP[iPos - 1][k / 10]; aDP[iPos][iCarry] = m; } } } static int64_t GetResult() { int64_t iRes = 0; for (size_t iPos = 0; iPos < iSize; ++iPos) { iRes += aDP[iPos][0]; } return iRes; } int main() { // freopen("sample_input.txt", "r", stdin); // freopen("sample_output.txt", "w", stdout); cin >> sA >> sB >> sC; iSize = sC.length(); PrepareTables(); FillTable(); int64_t iRes = GetResult(); cout << iRes; } |
English