Suma dzielników - skrócenie czasu wykonywania

0

Witam,

Czy jest jakiś inny sposób na obliczanie sumy dzielników, oprócz dzielenia modulo i zwykłego dzielenia a potem mnożenia? Bo na spoju mam ciągle błąd przekroczono limit czasu. Tutaj link do zadania http://pl.spoj.com/WSDOCPP/problems/DZIELN/

Tutaj mój kod

#include<stdio.h>
#include<stdlib.h>

int dzielnik(int liczba)
{
	int i,suma=0,k;
	for (i=1; i<=liczba; i++)
		if(liczba%i==0)        // lub k=liczba/i;
		suma+=i;               // if(k*i==liczba)
	return suma;
}

int main()
{
int ilosc,i,n;
scanf("%d",&ilosc);
for(i=0; i<ilosc; i++){
	scanf("%d",&n);
	printf("%d\n",dzielnik(n));}
return 0;
}

poprawienie błędnego linku do treści zadania - fp

2

Rozważ rozbicie na iloczyn liczb pierwszych.

3

Suma wszystkich dzielników nazywa się funkcją sigma. Jeżeli a i b są liczbami pierwszymi, to zachodzi: sigma(a*b) = sigma(a) * sigma(b)

Edit: a i b muszą być różne

zachodzi też sigma(p^k) = (p^[k+1] - 1) / (p - 1)

ogólnie jest:
n = p[1]^k[1] * p[2]^k[2] * ... * p[r]^k[r]

sigma(n) = sigma(p[1]^k[1]) * sigma(p[2] ^ k[2]) * ... * sigma(p[r] ^ k[r])

1 użytkowników online, w tym zalogowanych: 0, gości: 1