Cod sursa(job #1706673)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 22 mai 2016 22:55:32
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <stdlib.h>
#define MOD 9973

inline long long multiply(long long a, long long n){
    return (a*n)%MOD;
}

inline long long exponentiate(long long a, long long n){
    long long p=1LL;
    while(n>0){
        if(n%2==1)
            p=multiply(p, a);
        a=multiply(a, a);
        n/=2;
    }
    return p;
}

char ciur[1000001];
long long prime[1000001], ind;

inline void prepare(){
    ciur[0]=ciur[1]=1;
    for(int i=2;i*i<=1000000;i++)
        if(ciur[i]==0)
            for(int j=i*i;j<=1000000;j+=i)
                ciur[j]=1;
    ind=0;
    for(int i=2;i<=1000000;i++)
        if(ciur[i]==0)
            prime[ind++]=i;
    //printf("%d ", ind);
}


int main(){
    int n, i;
    FILE*fi,*fo;
    fi=fopen("ssnd.in","r");
    fo=fopen("ssnd.out","w");
    fscanf(fi,"%d", &n);
    prepare();
    for(i=0;i<n;i++){
        long long x;
        fscanf(fi,"%lld", &x);
        long long div=0;
        long long numdiv=1;
        long long sumdiv=1;
        while(div<ind && prime[div]*prime[div]<=x){
            if(x%prime[div]==0){
                long long b, exp=1;
                while(x%prime[div]==0){
                    exp++;
                    x/=prime[div];
                }
                b=exponentiate(prime[div], exp);
                numdiv=numdiv*exp;
                sumdiv=(sumdiv*((b-1+MOD)%MOD)*exponentiate(prime[div]-1, MOD-2))%MOD;
            }
            div++;
        }
        if(x>1){
            numdiv=numdiv*2;
            sumdiv=(sumdiv*(x+1))%MOD;
        }
        fprintf(fo,"%lld %lld\n", numdiv, sumdiv);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}