Cod sursa(job #1649162)

Utilizator george_stelianChichirim George george_stelian Data 11 martie 2016 12:42:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>

using namespace std;

const int lim=1000000,mod=9973;
int prim[lim];
char vaz[lim+10];

int rid_put(int a,int n)
{
    int p=1;
    for(int i=1;i<=n;i<<=1)
    {
        if(n&i) p=(1LL*p*a)%mod;
        a=(1LL*a*a)%mod;
    }
    return p;
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    int nr=0,t;
    for(int i=2;i<=lim;i++)
        if(!vaz[i])
        {
            prim[++nr]=i;
            if(1LL*i*i<=lim)
                for(int j=i*i;j<=lim;j+=i) vaz[j]=1;
        }
    for(scanf("%d",&t);t;t--)
    {
        long long n,sol1=1;
        int sol2=1;
        scanf("%lld",&n);
        for(int i=1;i<=nr && 1LL*prim[i]*prim[i]<=n;i++)
            if(n%prim[i]==0)
            {
                int a=0;
                for(;n%prim[i]==0;n/=prim[i]) a++;
                sol1*=a+1;
                sol2=(1LL*((1LL*sol2*(rid_put(prim[i],a+1)-1))%mod)*rid_put(prim[i]-1,mod-2))%mod;
            }
        if(n>1)
        {
            sol1*=2;
            sol2=(1LL*sol2*(n+1))%mod;
        }
        printf("%lld %d\n",sol1,sol2);
    }
    return 0;
}