// Zadanie Dodawanie
// Potyczki algorytmiczne 2026
#include <iostream>
#include <string>
using namespace std;
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int npairs = 0;
string as, bs, cs;
cin >> as >> bs >> cs;
int len = as.length();
// xx[i] = j oznacza, źe dla k od i do j cyfry z pozycji k w obu liczbach dają
// wynik jednocyfrowy i zgodny z tym w trzeciej liczbie
// xx[i] = -1 w przec. razie
// taka heurystyka.
int i;
int *xx = new int[len];
int v = -1;
for (int i = len - 1; i >= 0; i--)
{
int d = as[i] - '0' + bs[i] - '0';
if (d < 10 && d == cs[i] - '0')
{
if (v == -1)
v = i;
}
else
v = -1;
xx[i] = v;
}
for (int i = 0; i < len; i++)
{
for (int j = i; j < len; j++)
{
if (xx[i] == -1 || j > xx[i]) // (i, j) nie jest w przedziale wyników 1-cyfr.
{
// Mozolne dodawanie.
int carry = 0;
int k;
for (k = j; k >= i; k--)
{
int c = as[k] - '0' + bs[k] - '0' + carry;
if (c > 9)
{
c -= 10;
carry = 1;
}
else
carry = 0;
if (c != cs[k] - '0')
break;
}
if (k < i && carry == 0)
npairs++;
}
else // Ominięcie
npairs++;
}
}
delete [] xx;
cout << npairs << endl;
// system("pause");
}
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 | // Zadanie Dodawanie // Potyczki algorytmiczne 2026 #include <iostream> #include <string> using namespace std; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int npairs = 0; string as, bs, cs; cin >> as >> bs >> cs; int len = as.length(); // xx[i] = j oznacza, źe dla k od i do j cyfry z pozycji k w obu liczbach dają // wynik jednocyfrowy i zgodny z tym w trzeciej liczbie // xx[i] = -1 w przec. razie // taka heurystyka. int i; int *xx = new int[len]; int v = -1; for (int i = len - 1; i >= 0; i--) { int d = as[i] - '0' + bs[i] - '0'; if (d < 10 && d == cs[i] - '0') { if (v == -1) v = i; } else v = -1; xx[i] = v; } for (int i = 0; i < len; i++) { for (int j = i; j < len; j++) { if (xx[i] == -1 || j > xx[i]) // (i, j) nie jest w przedziale wyników 1-cyfr. { // Mozolne dodawanie. int carry = 0; int k; for (k = j; k >= i; k--) { int c = as[k] - '0' + bs[k] - '0' + carry; if (c > 9) { c -= 10; carry = 1; } else carry = 0; if (c != cs[k] - '0') break; } if (k < i && carry == 0) npairs++; } else // Ominięcie npairs++; } } delete [] xx; cout << npairs << endl; // system("pause"); } |
English