Cod sursa(job #1927542)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 15 martie 2017 10:53:48
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <cstdio>
#include <cmath>
#include <bitset>
#define MOD 9973
#define VAL 1000005

using namespace std;

long long T, cnt, k, e;
long long v[VAL], K;
long long N, i, j, nr;
long long NRDIV, P;
long long SUM, NR;
bitset<VAL> ok;

int poz=0;
char buff[VAL];

long long citeste()
{
    long long nr=0;
    while (buff[poz]<'0' || buff[poz]>'9')
      if (++poz==VAL)
        fread(buff, 1, VAL, stdin), poz=0;
    while (buff[poz]>='0' && buff[poz]<='9')
    {
        nr=nr*10+buff[poz]-'0';
        if (++poz==VAL)
          fread(buff, 1, VAL, stdin), poz=0;
    }
    return nr;
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    ok[1]=ok[0]=1;
    for (i=2; i<=VAL; i++)
    {
        if (ok[i]==0)
        {
            v[++K]=i;
            for (j=i*i; j<=VAL; j+=i)
              ok[i]=1;
        }
    }
    T=citeste();
    for (cnt=1; cnt<=T; cnt++)
    {
        N=citeste();
        SUM=1;
        NRDIV=1;
        for (k=1; 1LL*v[k]*v[k]<=N; k++)
        {
            nr=v[k];
            e=1;
            while (N % nr==0)
            {
                N/=nr;
                e++;
            }
            P=pow(nr, e);
            NRDIV*=e;
            NR=(P-1) / (nr-1);
            SUM*=NR;
        }
        if (N!=1)
        {
            N%=MOD;
            NRDIV*=2;
            NR=(N*N-1) / (N-1);
            NR%=MOD;
            SUM*=NR;
        }
        SUM%=MOD;
        printf("%lld %lld\n", NRDIV, SUM);
    }
    return 0;
}