Cod sursa(job #1486437)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 14 septembrie 2015 20:59:29
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <cmath>
#define MOD 9973
bool ciur[1000001];
int prime[80001];
int t;
long long n;
long long put(int a,int b)
{
    long long res=1,num=a;
    for(;b!=0;b>>=1)
    {
        if((b&1)==1)
        {
            res*=num;
        }
        num*=num;
    }
    return res;
}
int main()
{
    freopen ("ssnd.in","r",stdin);
    freopen ("ssnd.out","w",stdout);
    int ct=1;
    for(int i=2; i<=1000000; i++)
    {
        if(ciur[i]==0)
        {
            for(int j=i; j<=1000000/i; j++) ciur[i*j]=1;
        }
    }
    for(int i=2; i<=1000000; i++)
    {
        if(ciur[i]==0)
        {
            prime[ct]=i;
            ct++;
        }
    }
    scanf("%d",&t);
    for(int x=1; x<=t; x++)
    {
        long long pcard=1,psum=1;
        scanf("%lld",&n);
        int lun=sqrt(n)+1;
        for(int i=1; i<ct&&prime[i]*prime[i]<=n; i++)
        {
            if(n%prime[i]==0)
            {
                int c=0;
                while(n%prime[i]==0)
                {
                    n/=prime[i];
                    c++;
                }
                pcard*=(c+1);
                psum*=((put(prime[i],c+1)-1));
                psum/=((prime[i]-1));
                psum%=MOD;
                if(n==1) break;
            }
        }
        if(n!=1)
        {
            pcard*=2;
            psum*=(n*n-1);
            psum/=(n-1);
            psum%=MOD;
        }
        printf("%lld %lld\n",pcard,psum);
    }
}