С++.Даю 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++
альтернативное решение через сет приведу в ответах
если идти до корня, то ответ не правильный
вместо 4 и 12 выдает 4 и 3 при n = 6
4 и 12 и выводит
все правильно, ты что-то криво переписал
Ответы
Ответ дал:
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;
}
может 1 и N в твоей задаче не надо учитывать.
или нужно сначала сумму, а потом количество
контест из сириуса. вариант с 6 подходит. ответ там 4 и 12. но остальные тесты я хз какие не проходит
замени все int на long long
по порядку там все верно, может переменные маленькие. я попробую на лонгшезам лонгшезам поменять
поменял инты уже. все равно не проходит
с лонгами должно проходить
оч странно
я сейчас перебрал циклом все варианты и сравнивал результат своего кода с результатом твоего, которые перебирает прям все от 1 до N идет и все последовательно считает и ни одного расхождения
так что где-то у тебя косяк
Вас заинтересует
2 года назад
3 года назад
3 года назад
8 лет назад