/* 1. Vsota stevk vseh lihih stevil od 0-10 = 25 - 1 + 3 + 5 + 7 + 9 2. Vsota stevk vseh lihih stevil od 10-100 = 450 = 5 * 45 + 9 * 25 = (5 * 1 + 5 * 2 + ... + 5 * 9) + 9 * stevke lihe (0-10) 3. Vsota stevk vseh lihih stevil od 0-100 = 475 Vsota stevk vseh lihih stevil od 100-1000 = 6525 = 50 * 45 + 9 * 475 */ #include #include #include using namespace std; string odstevanje_stringov(string vecji, string manjsi) { if (vecji.compare(manjsi) == 0) return "0"; string rez; int temp, ostanek = 0; int vindex = (int)vecji.size() - 1, mindex = (int)manjsi.size() - 1; //cout << "in"; while (mindex >= 0) { temp = vecji[vindex--] - manjsi[mindex--] - ostanek; if (temp < 0) { temp += 10; ostanek = 1; } else ostanek = 0; rez.push_back(temp +'0'); } while (vindex >= 0) { temp = vecji[vindex--] - ostanek; if (temp < '0') { temp += 10; ostanek = 1; } else ostanek = 0; rez.push_back(temp); } while (rez.back() == '0') rez.pop_back(); reverse(rez.begin(), rez.end()); //cout << "out"; return rez; } string sestevanje_stringov(string b1, string b2) { string rezultat, r; int st1, st2, ostanek; int p1, p2; //cout << "in " << b1 << " " << b2 << endl; p1 = (int)b1.size() - 1; p2 = (int)b2.size() - 1; ostanek = 0; while ((p1 >= 0) || (p2 >= 0)) { if (p1 >= 0) { st1 = b1[p1] - 48; p1--; } else { st1 = 0; } if (p2 >= 0) { st2 = b2[p2] - 48; p2--; } else { st2 = 0; } st1 = st1 + st2 + ostanek; st2 = st1 % 10; ostanek = st1 / 10; r = st2 + 48; rezultat = r + rezultat; if ((p1<0) && (p2<0)) { while (ostanek>0) { st2 = ostanek % 10; ostanek = ostanek / 10; r = st2 + 48; rezultat = r + rezultat; } } } //cout << "out " << rezultat << endl; return rezultat; } string izracun(int st) { string rez = "0"; int temp; st = (st + 1) / 2; //toliko je lihih stevk- //obravnava enic temp = st; //rez += (temp / 5) * 25; rez = sestevanje_stringov(rez, to_string(temp / 5 * 25)); temp %= 5; //rez += temp*temp; //vsota aritmetičnega zaporedja = n(2a1 + (n-1)*2)/2 = n(1 + n-1) = n*n rez = sestevanje_stringov(rez, to_string(temp*temp)); for (int i = 5; i > 0; i *= 10) { temp = st; //rez += temp / (10 * i) * (i * 45); rez = sestevanje_stringov(rez, to_string(temp / (10 * i) * (i * 45))); temp %= 10 * i; for (int j = 0; j < 9; j++) { //rez += min(temp, i) * j; rez = sestevanje_stringov(rez, to_string(min(temp, i) * j)); temp -= i; if (temp <= 0) break; } } return rez; } int main() { int mmin, mmax; cin >> mmin >> mmax; cout << odstevanje_stringov(izracun(mmax), izracun(mmin - 1)); return 0; }