Cod sursa(job #1791484)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 29 octombrie 2016 13:57:40
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <iostream>
using namespace std;
long long int div=1,sum=1,pos=1;
int primes[80005];
bool sieve[1000005];
void getsieve()
{

    primes[0]=2;

    sieve[0] = 1;

    sieve[1] = 1;

    int i,j;
    for(i=4; i*i<=1000000; i+=2)
        sieve[i]=1;

    for(i=3; i*i<=1000000; i+=2) // start from 3 since only prime even is 2

        if(sieve[i]==0)
        {
            primes[pos]=i; // generate primes vector
            ++pos;
            for(j=i+i; j<=1000000; j+=2)
            {
                if(!sieve[j])
                    sieve[j]=1;
            }
        }

}
int pow(int a,int b)
{
    int i,p=1;
    for(i=1; i<=b; i++)
        p*=a;
    return p;
}
void tr(int n)
{
    int poz=0,put=0;
    div=1;
    sum=1;
    for(int i=0; primes[i]*primes[i]<=n && n>1 && i<n; i++)
    {
        while(n%primes[i]==0&&n>1)
        {
            n/=primes[i];
            put++;
            //cout << "1";
        }
        div*=(put+1);
        div%=9973;
        sum*=(pow(primes[i],put+1)-1);
        sum/=(primes[i]-1);
        sum%=9973;
        put=0;
        //cout << "3";
    }
    if(n>1)
    {
        div*=2;
        sum=sum*(n+1);
    }

}
int main()
{
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    getsieve();
    int n,p;
    cin>>n;
    while(n)
    {
        cin>>p;
        tr(p);
        cout << div << " " << sum << endl;
        //cout << "2";
        n--;
    }
    return 0;
}