Cod sursa(job #2130469)

Utilizator IsacLucianIsac Lucian IsacLucian Data 13 februarie 2018 18:23:18
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#define MOD 9973

using namespace std;

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

int Q,nrp[100000],k;
bitset<1000005>ciur;

void Generare()
{
    int i,j;
    ciur[1]=1;
    for(i=4;i<=1000000;i+=2)
        ciur[i]=1;

    for(i=3;i*i<=1000000;i+=2)
        if(!ciur[i])
            for(j=i*i;j<=1000000;j+=2*i)
                ciur[j]=1;

    k=1;
    nrp[k]=2;
    for(i=3;i<=1000000;i+=2)
        if(!ciur[i])nrp[++k]=i;
}

int Lgput_MOD(int a,int n)
{
    int p=1;
    while(n)
    {
        if(n%2)p=1LL*p*a%MOD;
        n/=2;
        a=1LL*a*a%MOD;
    }
    return p;
}

long long Lgput(int a,int n)
{
    long long p=1;
    while(n)
    {
        if(n%2)p=p*a;
        n/=2;
        a=a*a;
    }
    return p;
}

void Solutie(int n)
{
    int i,d,nrdiv,sum,x,y;
    sum=nrdiv=1;

    i=1;
    d=nrp[1];
    while(n && d*d<=n && i<=k)
    {
        if(n%d==0)
        {
            x=0;
            while(n%d==0)
            {
                x++;
                n/=d;
            }
            nrdiv=nrdiv*(d+1);
            y=Lgput(d,(x+1))-1;
            if(y<0)y+=MOD;

            sum=(1LL*sum*y%MOD*Lgput_MOD((d-1),MOD-2)%MOD)%MOD;
        }
        d=nrp[++i];
    }

    if(n>1)
    {
        nrdiv*=2;
        y=Lgput(n,2)-1;
        if(y<0)y+=MOD;

        sum=(1LL*sum*y%MOD*Lgput_MOD((n-1),MOD-2)%MOD)%MOD;
    }
    fout<<nrdiv<<" "<<sum<<"\n";
}
int main()
{
    Generare();
    fin>>Q;
    while(Q--)
    {
        int x;
        fin>>x;
        Solutie(x);
    }

    fin.close();
    fout.close();
    return 0;
}