Cod sursa(job #2281811)

Utilizator HoratioHoratiu Duma Horatio Data 12 noiembrie 2018 19:31:03
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.49 kb
#include <cstdio>
#include <bits/stdc++.h>
#define big 1000005
#define MOD 9973
using namespace std;

int sir[1000005];
int prime[10000];
int lp=0;
int t;

int ldesc=-1;

long putere=0;


pair<long, long> inversmod(int a, int b)
{
    if (b == 0)
        return { 1, 0 };
    pair <long,long>p = inversmod(b, a % b);
    return { p.second,  p.first - a / b * p.second };
}

void genciur()
{
    for(int i=3; i<big; i+=2)
        if(!sir[i])
        {
            prime[++lp]=i;
            for(int j=2*i; j<=big; j+=i)
                sir[j]=1;
        }
    prime[0]=2;
}

long logp(long p,long n)
{
    long t=1;
    while(p>1)
    {
        if(p%2==1)
        {
            t=(t % MOD)*(n % MOD);
            p--;
        }
        n=(n*n)%MOD;
        p/=2;
    }
    return (n*t)%MOD;
}

void nrsisum(int putere,long numar)
{
    int nrdiv=1;
    for(int i=0; i<=ldesc; i++)
        nrdiv*=putere+1;
    printf("%ld ",nrdiv);


}


void calcul()
{
    int nrdiv=1;
    int sumadiv=1;


    char c[13];
    long n=0;
    ldesc=-1;
    scanf("%s\n",&c);
    int l=strlen(c);
    for(int i=0; i<l; i++)
    {
        n=n*10+(c[i]-'0');
    }

    for(int i=0; i<lp && n!=1; i++)
        if(i*i>n)
        {
            putere=1;
             nrdiv*=putere+1;

            if((prime[i]-1)!=0)
            {
                long p=logp(putere+1,n)-1;
                if(p<0)
                    p+=MOD;
                sumadiv*=p;
                sumadiv=sumadiv % MOD;

                long a=inversmod((n-1),MOD).first;
                while(a<0)
                    a+=MOD;
                sumadiv*=a%MOD;

                sumadiv=sumadiv % MOD;
            }
            else
                sumadiv*=putere+1;

            break;
        }
        else if(n%prime[i]==0)
        {
            putere=0;
            while(n%prime[i]==0)
            {
                n/=prime[i];
                putere++;
            }

            nrdiv*=putere+1;

            if((prime[i]-1)!=0)
            {
                long p=logp(putere+1,prime[i])-1;
                if(p<0)
                    p+=MOD;
                sumadiv*=p;
                sumadiv=sumadiv % MOD;

                long a=inversmod((prime[i]-1),MOD).first;
                while(a<0)
                    a+=MOD;
                sumadiv*=a%MOD;

                sumadiv=sumadiv % MOD;
            }
            else
                {
                sumadiv*=putere+1 % MOD;
                sumadiv = sumadiv % MOD;
                }
        }
        printf("%d %d\n",nrdiv,sumadiv);
}


/*int nrdiv=1;
for(int i=0;i<=ldesc;i++)
    nrdiv*=desc[i].putere+1;
printf("%ld ",nrdiv);
{1}
long sumadiv=1;
for(int i=0;i<=ldesc;i++)
{
    if((desc[i].factor-1)!=0)
        {
        long p=logp(desc[i].putere+1,desc[i].factor)-1;
        if(p<0)
            p+=MOD;
        sumadiv*=p;
        sumadiv=sumadiv % MOD;
{1}
        long a=inversmod((desc[i].factor-1),MOD).first;
        while(a<0)
            a+=MOD;
        sumadiv*=a%MOD;
{1}
        sumadiv=sumadiv % MOD;
        }
    else
        sumadiv*=desc[i].putere+1;
}
printf("%ld\n",sumadiv);
*/




void prelucrare()
{
    scanf("%d\n",&t);

    for(int i=0; i<t; i++)
    {
        calcul();
    }
}









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

    return 0;
}