Cod sursa(job #1183714)

Utilizator xtreme77Patrick Sava xtreme77 Data 9 mai 2014 23:43:25
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cmath>
#define MAX 1000014
#define PRIME_MAX 100000
#define op %9973
using namespace std;
bool boolish[MAX];
int prime[PRIME_MAX],np;
void ciur();
int pow(int x,int y);
int main()
{
    int n,fact;
    long long x;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    ciur();
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%lld",&x);
        int number=1,suma=1;
        for(int j=1;j<=np and x>1;++j){
            fact=0;
            while(x%prime[j]==0){
                ++fact;
                x/=prime[j];
            }
            number*=(fact+1);
            int p1=(pow(prime[j],fact+1)-1)op;
            int p2=pow(prime[j]-1,9971)op;
            suma=(((suma*p1)op)*p2)op;;
        }
        if(x>1) {
            number*=2;
            suma=(1LL*suma*(x+1)op);
        }
        printf("%d %d\n",number,suma op);
    }
    return 0;
}
void ciur()
{
    int n=1000000,i,j,lim;
    lim=(int)sqrt((double)n);
    prime[1] = 2; np = 1;
    for (i=3; i<=lim; i=i+2)
        if (boolish[i]==0){
            for (j=i*i; j<=n; j=j+2*i)
                boolish[j]=1;
            prime[++np]=i;
        }
    for(i=prime[np]+2; i<=n; i=i+2)
        if(boolish[i]==0)
            prime[++np]=i;

}
int pow(int x,int y){
    int rez;
    for(rez=1;y;y>>=1){
        if(y&1){
            rez=(1LL*rez*x)op;
        }
        x=(1LL*x*x)op;
    }
    return rez op;
}