Cod sursa(job #1476814)

Utilizator k_ounu_eddyIacob Eduard k_ounu_eddy Data 25 august 2015 13:30:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 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> prim;
int nrPrime[100001];
int cntNrPrime = 1;

void ciur()
{
    nrPrime[cntNrPrime++] = 1;
    for(int i=2;i<MAX;i++)
    {
        int j=i;
        if(prim[j] == 0)
        {
            nrPrime[cntNrPrime++] = j;
            for(j = i+i ;j<=MAX;j+=i)
                prim[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;
        for(int ii=2;(1LL * nrPrime[ii] * nrPrime[ii]<=N) && (ii<cntNrPrime);ii++)
        {
            if(n%nrPrime[ii] !=0)
                continue;

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

// infoarena
            long long p1 = (pow(nrPrime[ii], d+1) - 1) % MOD;
            long long p2 = pow(nrPrime[ii]-1, MOD-2) % MOD;
            sum = (((sum * p1) % MOD) * p2) % MOD;
// infoarena
        }

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

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