Definition: A proper divisor of a natural number is the divisor that is strictly less than the number.
e.g. number 20 has 5 proper divisors: 1, 2, 4, 5, 10, and the divisor summation is: 1 + 2 + 4 + 5 + 10 = 22.
Input
An integer stating the number of test cases (equal to about 200000), and that many lines follow, each containing one integer between 1 and 500000 inclusive.
Output
One integer each line: the divisor summation of the integer given respectively.
Example
Sample Input:
3
2
10
20
Sample Output:
1
8
22
https://www.spoj.pl/problems/DIVSUM/
public class DivisorSummation { public static void main( String args[] ) throws Exception { // Almacena la suma de los divisores para cada numero de 1 hasta 500000 int[] sumDivisores = new int[ 500001 ]; sumDivisores[ 1 ] = -1; int multiplo, factor; /* * En cada posicion del vector acumulamos la suma de divisores de dicha * posicion. Para eso tenemos en cuenta de que si: * A divide a X, entonces A y X/A son divisores de X, por lo tanto sumamos * A y X/A a sumDivisores[ X ], pero si A = X/A, solo sumamos A a sumDivisores[ X ] * ya que sino estariamos sumando 2 veces un mismo divisor. * Solo es necesario iterar desde 2 hasta la raiz cuadradada de 500000 */ for( int num = 2; num <= 707; num ++ ) { multiplo = num * num; sumDivisores[ multiplo ] += num; for( multiplo += num, factor = num + 1; multiplo <= 500000; multiplo += num, factor ++ ) sumDivisores[ multiplo ] += ( num + factor ); } // Tamanio del buffer de salida int tamanio = 0; String cadena; int longitud, numero; // Numero de casos a procesar int numCasos = sig(); // Buffer de salida, creada con un tamanio adecuado char[] salida = new char[ numCasos * 6 ]; for( int i = 0; i < numCasos; i ++ ) { numero = sig(); cadena = ( sumDivisores[ numero ] + 1 ) + "\n"; longitud = cadena.length(); // Anadimos la cadena al buffer de salida cadena.getChars( 0, longitud, salida, tamanio ); tamanio = tamanio + longitud; } System.out.print( new String( salida, 0, tamanio ) ); } public static int sig() throws Exception { int car = System.in.read(); int val = 0; while( car != 10 ) { val = val * 10 + ( car - 48 ); car = System.in.read(); } return val; } }
No hay comentarios:
Publicar un comentario