Cod sursa(job #764258)

Utilizator test666013Testez test666013 Data 4 iulie 2012 16:28:56
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 1000001
#define MOD 9973

long long pr[80000];
int nr;

void ciur(){
    bool p[MAX];
    int i = 2;
    memset(p,0,sizeof(p));
    while(i <= 1000)
    {
        while(p[i])i++;
        for(int j=i*i;j < MAX;j+=i)p[j] = 1;
        i++;
    }
    for(int i=2;i<MAX;i++) if( !p[i] )pr[++nr] = i;
}

void desc(long long n){
    long long sum = 1, nrm = 1, d, p;
    int i = 1;
    while(n != 1 && i <= nr && pr[i] * pr[i] <= n)
    {
        if(n%pr[i] == 0)
        {
            d = 0;
            p = pr[i];
            while(n%pr[i] == 0)
            {
                d++;
                p *= pr[i];
                n /= pr[i];
            }
            nrm *= (d+1);
            sum = (sum * ((p-1)/(pr[i]-1))) % MOD;
        }
        i++;
    }
    if(n != 1)
    {
        nrm *= 2;
        sum = (sum * ((n*n-1)/(n-1))) % MOD;
    }
    printf("%lld %lld\n",nrm,sum);
}


int main(){
    int t;
    long long n;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&n);
            desc(n);
        }
    return 0;
}