Cod sursa(job #2085816)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 10 decembrie 2017 19:13:30
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <vector>
#include <cassert>
#define MOD 9973
using namespace std;

FILE *in = fopen("ssnd.in","r");
FILE *out = fopen("ssnd.out","w");

bool prim[1000005];
int t;
vector <int> num;

void ciur()
{
    prim[1]=1;
    num.push_back(2);
    for(int i=3; i <= 1000000; i+=2)
        if(prim[i]==0)
            {
                num.push_back(i);
                for(int j=i; j <= 1000000; j+=i)
                prim[j]=1;
                }

}

int putere(long long x,long long e)
{
    long long r=1;
    for(int d=0; (1<<d) <= e; d++)
    {
        if((1<<d)&e)
        {
            r=(r*x)%MOD;
        }
        x=(x*x)%MOD;
    }
    return r;
}

int invmod(long long x)
{
    return putere(x,MOD-2);
}

void desc(long long x)
{
    int e,k=0,p=1,sums=1,sumj=1;
    assert(num[k] != 0);
    while(x!=1 && 1LL*num[k]*num[k] <= x)
    {
        e=0;
        while(x%num[k]==0)
        {
            e++;
            x/=num[k];
        }
        p*=e+1;
        if(e>0)
        {
        sums = (sums * (putere(num[k],e + 1)+MOD-1)%MOD ) %MOD;
        sumj = (sumj * (num[k]-1)) % MOD;
        }
        k++;
    }
    if(x!=1)
    {
        sums = (sums * (putere(x,2)+MOD-1)%MOD) %MOD;
        sumj = (sumj * (x-1)) % MOD;
        p*=2;
    }
    fprintf(out,"%d %d\n",p,(sums*invmod(sumj))%MOD);
}

int main()
{
    fscanf(in,"%d",&t);
    ciur();
    while(t)
    {
        long long x;
        fscanf(in,"%lld",&x);
        desc(x);
        t--;
    }
    return 0;
}