Cod sursa(job #1228836)

Utilizator george_stelianChichirim George george_stelian Data 15 septembrie 2014 17:18:39
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#define mod 9973
#define limciur 1000000

using namespace std;

int nrp[500000],t,i,nr,x,a,b,solnr,solsum;
long long n,j;
char ciur[1000010];

int ridput(int x,int y)
{
    int i,sol=1;
    x%=mod;
    for(i=1;i<=y;i<<=1)
    {
        if(i&y) sol=(sol*x)%mod;
        x=(x*x)%mod;
    }
    return sol;
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    for(i=2;i<=limciur;i++)
        if(!ciur[i])
        {
            nrp[++nr]=i;
            for(j=1LL*i*i;j<=limciur;j+=i) ciur[j]=1;
        }
    for(scanf("%d",&t);t;t--)
    {
        scanf("%lld",&n);
        solnr=solsum=1;
        for(i=1;i<=nr && 1LL*nrp[i]*nrp[i]<=n;i++)
            if(n%nrp[i]==0)
            {
                x=0;
                while(n%nrp[i]==0)
                {
                    x++;
                    n/=nrp[i];
                }
                solnr*=x+1;
                a=(ridput(nrp[i],x+1)-1+mod)%mod;
                b=ridput(nrp[i]-1,mod-2)%mod;
                solsum=(((solsum*a)%mod)*b)%mod;
            }
        if(n>1)
        {
            solnr*=2;
            solsum=(solsum*(n+1))%mod;
        }
        printf("%d %d\n",solnr,solsum);
    }
    return 0;
}