Cod sursa(job #1423719)

Utilizator TeodorescuStefanEduardTeodorescu Stefan Eduard TeodorescuStefanEduard Data 22 aprilie 2015 14:06:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<cstdio>
 
#define MAX 1000010
 
long long n,pr;
int nd;
bool V[MAX];
 
int T[MAX/2],t;
 
inline long long  pow(long long x,int p)
{
   long long pr=1;
    while(p!=1)
    {
        if(p%2==0)
        {
            x=(1LL*x*x);
            p=p/2;
        }
        else
        {
           pr=(pr*x);
           p=p-1;
        }
    }
    return (pr*x);
}
 
int main()
{
    FILE *in,*out;
    in=fopen("ssnd.in","r");
    out=fopen("ssnd.out","w");
    fscanf(in,"%d",&t);
    int i,j;
 
    int nx=0;
    for(i=2;i<=MAX;i++)
    {
        if(V[i]==0)
        {
          T[++nx]=i;
          for(j=i;j<=MAX/i;j++)
                   V[i*j]=1;
        }
    }
    int nr=1;
    long long s=1;
    for(int k=1;k<=t;k++)
    {
        fscanf(in,"%lld",&n);
        nr=1;
        s=1;
        for(j=1;j<=nx && 1LL*T[j]*T[j]<=n;j++)
        {
            if(n%T[j])
                continue;
                        pr=1,nd=0;
                        while(n!=1 && n%T[j]==0)
                        {
                            nd++;
                            n=n/T[j];
                 
                        };
                  nr=nr * (nd+1);
                  s=(s* (pow(1LL*T[j],nd+1)-1)/(T[j]-1))%9973;
        }
        if(n>1)
        {
            nr=nr *2;
            s=(s*((n*n)-1)/(n-1))%9973;
        }
        fprintf(out,"%d %d\n",nr,s);
    }
    fclose(in);
    fclose(out);
    return 0;
}