Cod sursa(job #1558613)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 29 decembrie 2015 13:53:41
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
#include<iostream>
using namespace std;
const int nmax=1000000;
const int md=9973;
bool ci[nmax+5];
long long pr[nmax/10],ex[nmax/10],inv[md+5];
long long rlog(long long x,long long p)
{
    long long rez = 1;
    x %= md;

    for(; p; p >>= 1)
    {
        if(p & 1)
        {
            rez *= x;
            if(rez>=md)
                rez %= md;
        }

        x *= x;
        if(x>=md)
            x %= md;
    }
    return rez;
}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    long long t,n,i,j,q,l,nr,sum;
    l=1;
    pr[1]=2;
    for(i=3; i<=nmax; i=i+2)
    {
        if(ci[i]==0)
        {
            l++;
            pr[l]=i;
            for(j=i*i; j<=nmax; j=j+2*i)
                ci[j]=1;
        }
    }
    cin>>t;
    for(q=1; q<=t; q++)
    {
        cin>>n;
        ex[l+1]=0;
        nr=sum=1;
        for(i=1; i<=l && pr[i]*pr[i]<=n; i++)
            if(n%pr[i]==0)
            {
                ex[i]=0;
                while(n%pr[i]==0)
                {
                    n=n/pr[i];
                    ex[i]++;
                }
                nr*=(ex[i]+1);
                sum=(sum*((rlog(pr[i],ex[i]+1))-1+md)*(rlog((pr[i]-1),md-2)));
                if(sum>=md)
                    sum=sum%md;
            }
        if(n>1)
        {
            nr*=2;
                sum=(sum*((rlog(n,2))-1+md)*(rlog((n-1),md-2)));
                if(sum>=md)
                    sum=sum%md;
        }
        cout<<nr<<" "<<sum<<"\n";
    }
    return 0;
}