Cod sursa(job #1160215)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 30 martie 2014 12:56:47
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <bitset>

using namespace std;

int t, a, nq, nr[1000050], sum;
bitset<10000050> prim;

void ciur()
{
    nr[nq++] = 2;
    for(int d=3; d*d<1000000; d+=2){
        if(prim[d]==0)
            nr[nq++] = d;
        for(int i=d; i<1000000; i+=2*d)
            prim[i] = 1;
    }
}

int putere(int x, int y)
{
    int n=x;
    int rez=1;
    for(int i=0; 1<<i<=y; i++){
        if((1<<i) & y){
            rez*=n;
        }
        n = n*n;
    }
    return rez;
}

void diviz(int a)
{
    sum=1;
    int nrd=1, d, e;
    for(int i=0; nr[i]*nr[i]<=a; i++){
        d = nr[i];
        e = 0;
        while(a%d==0){
            a/=d;
            e++;
        }
        if(e){
            nrd *= (e+1);
            sum*= ((putere(d, e+1)-1)/(d-1))%9973;
            sum%=9973;
        }
    }
    if(a!=1){
        nrd *= 2;
        sum*= ((a*a-1)/(a-1))%9973;
        sum%=9973;
    }
    //cerr << suma << "\n";
    printf("%d %d\n", nrd, sum);
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    scanf("%d", &t);
    ciur();
    for(int i=0; i<t; i++){
        scanf("%d ", &a);
        diviz(a);
    }
    return 0;
}