Cod sursa(job #1791486)

Utilizator Carol_LucaCarol Luca Carol_Luca Data 29 octombrie 2016 13:57:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
long long int div=1,sum=1;
bool sieve[1000001];
int primes[80001];
void setSieve(int n)
{
    int i,j,lim=(int)sqrt(double(n));
    int cnt=0;
    primes[cnt]=2;
    cnt++;
    for(i=4;i<=n;i+=2)
        sieve[i]=1;
    for(i=3;i<=lim;i+=2)
    {
        if(sieve[i]==0)
        {
            primes[cnt]=i;
            cnt++;
            for(j=2*i;j<=n;j+=i)
                sieve[j]=1;
        }
    }
}
int pow(int a,int b)
{
    long long int p=1;
    int i;
    for(i=1;i<=b;i++)
        p*=a;
    return p;
}
void ndiv(int n)
{
    int put=0,i;
    for(i=0;primes[i]*primes[i]<=n&&n>1;i++)
    {
        while(n%primes[i]==0)
        {
            n=n/primes[i];
            put++;
        }
        div*=(put+1);
        div%=9973;
        sum*=(pow(primes[i],put+1)-1);
        sum/=(primes[i]-1);
        sum%=9973;
        put=0;
    }
    if(n>1)
    {
        div=div*2;
        div%=9973;
        sum=sum*(n+1);
        sum%=9973;
    }
}
int main()
{
    int n,i,x;
    in>>x;
    setSieve(1000001);
    for(i=1;i<=x;i++)
    {
        in>>n;
        div=1;
        sum=1;
        ndiv(n);
        out<<div<<" "<<sum<<endl;
    }
    return 0;
}