Cod sursa(job #2000903)

Utilizator Rodik_RodyRodica Vasilescu Rodik_Rody Data 15 iulie 2017 00:11:16
Problema Suma si numarul divizorilor Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define File_in "ssnd.in"
#define File_out "ssnd.out"
#define MAX 1000000000
char ciur[MAX];
long long n;
int P[100000],k;
void ciurul_lui_Eratosthenes()
{
    int i,j;
    for ( i = 2; i < 1000000; ++i)
        if( ciur[i] == 0){
            P[++k]=i;
            for(j= i+i; j < 1000000; j +=i)
                ciur[j] = 1;
    }

}
void ssnd (int *nr, int *s){
    int i,a,p;
    *nr = 1;
    *s = 1;
    if(n<1000001&&ciur[n]==0||n==1||n==0){
            *nr=2,*s=n+1;
        if(n == 1 || n == 0 )
            *nr = n,*s = n;
    }
    else{
        for ( i= 1;i<=k &&1ll*P[i]*P[i]<=n; i++ )
            if( n % P[i] == 0){
                a = 0;
                while(n%P[i]==0){
                    n/=P[i];
                    a++;
                }
                *nr=*nr*(a+1);
                *s= *s*((pow (P[i], a+1)-1)/(P[i]-1));
                *s%=9973;
            }
        if(n > 1) {
            *nr*=2;
            *s *=(n+1);
            *s%=9973;
        }
    }
}

int main()
{

    freopen(File_in, "r", stdin);
    freopen(File_out, "w", stdout);
    int t,i,j;
    scanf("%d",&t);
    ciurul_lui_Eratosthenes();
    for ( i = 1; i <= t; i++)
    {
        scanf("%lld",&n);
        int nr,s;
        ssnd(&nr,&s);
        printf("%d %d\n",nr,s);
    }

    return 0;
}