Cod sursa(job #1477070)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 25 august 2015 15:20:42
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<fstream>
#include<stdio.h>
#include<string.h>
#include<bitset>
using namespace std;

#define MOD 9973
#define MAX 100001

ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");

bitset<MAX> viz;
int nrPrime[100001];
int cntNrPrime = 1;

void ciur()
{
    nrPrime[cntNrPrime++] = 1;
    for(int i=2;i<MAX;i++)
    {
        int j=i;
        if(viz[j] == 0)
        {
            nrPrime[cntNrPrime++] = j;
            for(j = i+i ;j<=MAX;j+=i)
                viz[j] = 1;
        }
    }
}

inline int pow(int x, int p) {
    // INFOARENA
    int rez = 1;
    x %= MOD;
 
    for(; p; p >>= 1) {
        if(p & 1) {
            rez *= x;
            rez %= MOD;
        }
 
        x *= x;
        x %= MOD;
    }
 
    return rez;
}

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

    int t;
    long long n;
    //scanf("%d", &t);
    fin>>t;

    ciur();
    for(int i=1;i<=t;i++)
    {
        int cnt =1;
        //scanf("%lld", &n);
        fin>>n;

        long long N = n;
        long long sum = 1;
        long long q = 1;
        for(int ii=2;(1LL * nrPrime[ii] * nrPrime[ii]<=N) && (ii<cntNrPrime);ii++)
        {
            if(N%nrPrime[ii] !=0)
                continue;

            int d = 0;
            q = nrPrime[i];
            while(N%nrPrime[ii] == 0)
            {
                N/=nrPrime[ii];
                d++;
                q*=nrPrime[ii];
            }
            cnt *= (d+1);

// infoarena            
            sum = (sum*(q-1))/(nrPrime[ii]-1)%MOD;
// infoarena
        }

        if(N>1)
        {
// dp infoarena
            cnt *=2;  // nu inteleg de ce
            sum = (1LL*sum*(N + 1)) % MOD; // nu inteleg de ces
// infoarena
        }

        // printf("%d %lld\n",cnt, sum);
        fout<< cnt << " " << sum <<"\n";
    }
}