Cod sursa(job #1121378)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 25 februarie 2014 12:42:25
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <iostream>
using namespace std;
long long i,np,p[1000002],t;
long long P[100000],n,sd,nd,term,sum,cnt,prim;
void ciur();
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur();
    cin>>t;//scanf("%lld",&t);
    for(;t;t--)
    {
        sd=1;nd=1;
        cin>>n;//scanf("%lld",&n);
        //if(n==1){printf("1 1\n");continue;}
        for(i=1;i<=np&&P[i]*P[i]<=n;i++)
            if(n%P[i]==0)
            {
                sum=1;cnt=1;term=1;
                prim=P[i]%9973;
                while(n%P[i]==0)
                {
                    cnt++;
                    term=(term*prim)%9937;
                    sum=(sum+term)%9937;
                    n/=P[i];
                }
                sd=(sd*sum)%9973;
                nd*=cnt;
            }
        if(n>1){sd=(sd*(1+n))%9973;nd*=2;}
        cout<<nd<<' '<<sd<<'\n';//printf("%lld %lld\n",nd,sd);
    }
    return 0;
}
void ciur()
{
    P[1]=2;np=1;
    for(i=3;i<=1000;i+=2)
    if(!p[i])
    {
        P[++np]=i;
        for(int j=i*i;j<=1000000;j+=2*i)p[j]=1;
    }
    for(;i<=1000000;i+=2)
        if(!p[i])
            P[++np]=i;
}