Cod sursa(job #919481)

Utilizator lehman97Dimulescu David lehman97 Data 19 martie 2013 18:00:49
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <stdio.h>
#include <bitset>
#define MAX_N 1000002
#define MOD 9973

using namespace std;

FILE *f=fopen("ssnd.in","r");
FILE *g=fopen("ssnd.out","w");

bitset<MAX_N>prim;
long long b[MAX_N],t,i,nrdiv,j,a,put,sum,nr1,nr2;



long long ridic(long long a, long long p)
{
    long long i,cn=a,nr=1;
    for(i=0;(1<<i)<=p;i++)
    {
        if((1<<i)&p)nr=(nr*cn)%MOD;
        cn=(cn*cn)%MOD;
    }
    return nr;
}

void ciur()
{
    int i,j;
    b[0]=1;
    b[1]=2;
    for(i=3;i<=1000;i+=2)
    if(prim[i]==0)
    {
        b[++b[0]]=i;
        for(j=2*i;j<=MAX_N;j+=i)
        prim[j]=1;
    }
    for(i=1001;i<=MAX_N;i+=2)
    if(prim[i]==0) b[++b[0]]=i;
}

int main()
{
    fscanf(f,"%d",&t);
    ciur();
    for(i=1;i<=t;i++)
    {
        fscanf(f,"%lld",&a);
        nrdiv=1;
        j=1;
        sum=1;
        while(b[j]*b[j]<=a && a>1)
        {
            if(a%b[j]==0)
            {
                put=1;
                while(a%b[j]==0){a/=b[j];put++;}
                nr1=(ridic(b[j],put)-1)%MOD;
                nr2=ridic(b[j]-1,9971)%MOD;
                sum=(sum*nr1*nr2)%MOD;
                nrdiv=nrdiv*put;
            }
            j++;
        }
        if(a>1)
        {
            nrdiv=nrdiv*2;
            sum=(sum*((a+1)%MOD)%MOD);
        }
         fprintf(g,"%lld %lld\n",nrdiv,sum);

    }

    fclose(g);
    return 0;
}