Cod sursa(job #2285067)

Utilizator danielsociuSociu Daniel danielsociu Data 17 noiembrie 2018 23:47:04
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
std::ifstream cin("ssnd.in");
std::ofstream cout("ssnd.out");
#define ll long long
#define maxn 1000005
const int mod=9973;
ll primes[90000];
bool ciur[maxn];
ll t,x,k;

void allPrimes(); //creates all primes to 1 mil

int main()
{
    ll i,nr,s,pow,sum;
    cin>>t;
    allPrimes();
    for(;t--;){
        cin>>x;
        nr=1;s=1;i=1;
        while(x!=1){
            pow=0;
            sum=1;
            if(primes[i]*primes[i]>x){
                nr*=2;
                s=(s*((x*x-1)/(x-1)))%mod;
                x=1;
            }
            if(x%primes[i]==0){
                while(x%primes[i]==0)
                    pow++,x/=primes[i];
                nr*=(pow+1);
                for(int j=0;j<=pow;j++)
                    sum=(sum*primes[i])%mod;
                sum--;
                s=(s*(sum/(primes[i]-1)))%mod;
            }
            i++;
        }
        cout<<nr<<' '<<s%mod<<'\n';
    }
    return 0;
}

void allPrimes(){
    ll i,j;
    primes[1]=2;
    k=1;
    for(i=4;i<maxn;i+=2){
        ciur[i]=1;
    }
    for(i=3;i<maxn;i+=2)
        if(!ciur[i]){
            primes[++k]=i;
            for(j=i+i+i;j<maxn;j+=(i<<1))
                ciur[j]=1;
        }
}