Cod sursa(job #1607856)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 21 februarie 2016 17:27:42
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define SIZE 1000003
#define MODULO 9973

#define BIGBIGBIG 10000000000000003

bool fr[SIZE];
int v[75000];

inline int powi(int x, int pow)
{
    long long s=1;
    for(int i=0; i<pow; i++)
    {
        s*=x;
         if(s>BIGBIGBIG)
            {
                s%=MODULO;
            }
    }
    return s;
}
int main()
{
    int con,d,conj,srt,l,m,n,t;
    long long cd,x,s;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d ",&t);
    fr[2]=0;
    int sqrtSize=SIZE;
    int u=2;
    v[1]=2;
    v[2]=3;
    for(int i=5; i<=sqrtSize; i++)
    {
        if(i%2!=0&&i%3!=0&&fr[i]==0)
        {
            v[++u]=i;
            con=2;
            d=i;
            s=d*con;
            while(s<=SIZE)
            {
                fr[s]=1;
                s=d*con;
                con++;
            }
        }
    }

    for(int i=1; i<=t; i++)
    {
        scanf("%lld ",&x);
        srt=sqrt(x);
        s=1;
        cd=1;
        for(conj=1; x>1&& v[conj]*v[conj]<=x; conj++)
        {
            if(x%v[conj]){
                continue;
            }
            con=0;
            while(x%v[conj]==0)
            {
                con++;
                x=x/v[conj];
            }
            cd=cd*(con+1);

            n=powi(v[conj],con+1)-1;
            m=v[conj]-1;
            l=n/m;
            if(s>BIGBIGBIG)
            {
                s%=MODULO;
            }
            s=s*l;

        }
        if(x>1)
        {
            cd*=2;
            s*=((x*x)-1)/(x-1);
            if(s>BIGBIGBIG)
            {
                s%=MODULO;
            }
        }
        s%=MODULO;
        printf("%lld %lld\n",cd,s);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}