С++.Даю 20 баллов. Есть код на нахождение количества и суммы делитель числа. Нужно его оптимизировать. Выполняется очень долго
сам код:
#include < >

int main()
{
int n, s = 0, ans = 0;
std::cin >> n;
for(int i = 1; i <= n; i++)
{
if(n % i == 0)
{
ans = ans + i;
s++;
}
}
std::cout << s << " " << ans;
}


stglupa: ясен пень долго, ты зачем до N идешь-то? Иди до корня и если n % i == 0 && n / i != i то s += 2 иначе если n % i == 0 s++
stglupa: альтернативное решение через сет приведу в ответах
babakovi679: если идти до корня, то ответ не правильный
babakovi679: вместо 4 и 12 выдает 4 и 3 при n = 6
stglupa: 4 и 12 и выводит
stglupa: все правильно, ты что-то криво переписал

Ответы

Ответ дал: stglupa
1

pair<int,int> dels(int k){

   int sm = 0;

   set<int> s;

   for(int i = 1; i * i <= k; i++){

       if(k % i == 0){

           s.insert(i);

           s.insert(k/i);

           sm += i + k/i * (i != k/i);

       }

   }

   return {s.size(), sm};

}

signed main(){

   int n;

   cin >> n;

   pair<int, int> ans = dels(n);

   cout << ans.first << " " << ans.second;

}


stglupa: может 1 и N в твоей задаче не надо учитывать.
stglupa: или нужно сначала сумму, а потом количество
babakovi679: контест из сириуса. вариант с 6 подходит. ответ там 4 и 12. но остальные тесты я хз какие не проходит
stglupa: замени все int на long long
babakovi679: по порядку там все верно, может переменные маленькие. я попробую на лонгшезам лонгшезам поменять
babakovi679: поменял инты уже. все равно не проходит
stglupa: с лонгами должно проходить
stglupa: оч странно
stglupa: я сейчас перебрал циклом все варианты и сравнивал результат своего кода с результатом твоего, которые перебирает прям все от 1 до N идет и все последовательно считает и ни одного расхождения
stglupa: так что где-то у тебя косяк
Вас заинтересует