Cod sursa(job #759582)

Utilizator test13test13 test13 Data 18 iunie 2012 18:09:37
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LIM 1000001
#define NRP 78499
#define MOD 9973

int pr[NRP],nr;
long long x;

void ciur(){
    bool p[LIM];
    int i=2;
    memset(p,0,sizeof(p));
    while(i<=1000)
    {
        while(p[i])i++;
        for(int j=i*i;j<LIM;j+=i)p[j]=1;
        i++;
    }
    for(int i=2;i<LIM;i++)
    if(p[i]==0)pr[++nr]=i;
}

void desc()//long long x)
{
    int d = 1,nr = 1,i = 1;
    long long sum = 1,p;
  //  printf("%lld\n",(long long)(long long)x/(long long)2);
    while(i<NRP && x>1)
    {
       // printf("%lld\n",x);
        if(x%pr[i]==0)
        {
            d = 0; p = 1;
            while(x%pr[i]==0){ //printf("%lld\n",x);
                d++; p*=pr[i]; x/=pr[i]; }
          //  printf("%lld\n",x);
            nr *= (d+1); //printf("%d\n",nr);
            sum = (sum * ((p*pr[i]-1)/(pr[i]-1))) % MOD;
        }
        i++;
    }
    if(x>1)
    {
        nr *= 2;
        sum = (sum * ((x*x-1)/(x-1))) % MOD;
    }
    printf("%d %lld\n",nr,sum);
}

int main()
{
    int t;
    //long long x;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld",&x);
            desc();//x);
        }
  //      printf("%d\n",nr);
    return 0;
}