#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
uint64_t getVal(uint64_t size)
{
return ((size + 1) * size) / 2;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
string a, b, result;
cin >> a >> b >> result;
int n = a.size();
uint64_t curr_counter{};
uint64_t res{};
int carry{};
for (int i = n - 1; i >= 0; --i)
{
auto sum = a[i] - '0' + b[i] - '0';
auto c = result[i] - '0';
if (carry)
{
sum += 1;
if (sum == c)
{
carry = 0;
curr_counter += 1;
}
else if (sum % 10 == c)
{
carry = 1;
}
else if (sum - 1 == c)
{
//rezygnacja
res += getVal(curr_counter);
curr_counter = 1;
carry = 0;
}
else if ((sum - 1) % 10 == c)
{
//rezygnacja, ale nowe przeniesienie
res += getVal(curr_counter);
curr_counter = 0;
carry = 1;
}
else
{
//porazka
res += getVal(curr_counter);
curr_counter = 0;
carry = 0;
}
}
else
{
if (sum == c)
{
curr_counter += 1;
}
else if (sum % 10 == c)
{
carry = 1;
}
else
{
//porazka
res += getVal(curr_counter);
curr_counter = 0;
carry = 0;
}
}
}
res += getVal(curr_counter);
cout << res;
}
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 | #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; uint64_t getVal(uint64_t size) { return ((size + 1) * size) / 2; } int main() { cin.tie(0); ios::sync_with_stdio(0); string a, b, result; cin >> a >> b >> result; int n = a.size(); uint64_t curr_counter{}; uint64_t res{}; int carry{}; for (int i = n - 1; i >= 0; --i) { auto sum = a[i] - '0' + b[i] - '0'; auto c = result[i] - '0'; if (carry) { sum += 1; if (sum == c) { carry = 0; curr_counter += 1; } else if (sum % 10 == c) { carry = 1; } else if (sum - 1 == c) { //rezygnacja res += getVal(curr_counter); curr_counter = 1; carry = 0; } else if ((sum - 1) % 10 == c) { //rezygnacja, ale nowe przeniesienie res += getVal(curr_counter); curr_counter = 0; carry = 1; } else { //porazka res += getVal(curr_counter); curr_counter = 0; carry = 0; } } else { if (sum == c) { curr_counter += 1; } else if (sum % 10 == c) { carry = 1; } else { //porazka res += getVal(curr_counter); curr_counter = 0; carry = 0; } } } res += getVal(curr_counter); cout << res; } |
English