Cod sursa(job #1706652)

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

#define BUF_SIZE 8192
char buf[BUF_SIZE];
int poz;
FILE*fi;
inline char nextch(){
    if(poz==BUF_SIZE){
        fread(buf, 4096, 1, fi);
        poz=0;
    }
    return buf[poz++];
}


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

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;
}

int main(){
    int n, i;
    FILE*fo;
    fi=fopen("ssnd.in","r");
    fo=fopen("ssnd.out","w");
    fscanf(fi,"%d", &n);
    poz=BUF_SIZE;
    nextch();
    for(i=0;i<n;i++){
        long long x;
        x=0LL;
        char c=nextch();
        while('0'<=c && c<='9'){
            x=x*10+c-'0';
            c=nextch();
        }
        long long div=2;
        long long numdiv=1;
        long long sumdiv=1;
        while(div*div<=x && x>1){
            if(x%div==0){
                long long b=div%MOD, exp=1;
                while(x%div==0){
                    b=multiply(b, div);
                    exp++;
                    x/=div;
                }
                numdiv=multiply(numdiv, exp);
                sumdiv=multiply(multiply(sumdiv, b-1), exponentiate(div-1, MOD-2));
            }
            div++;
        }
        if(x>1){
            numdiv=(numdiv*2)%MOD;
            sumdiv=multiply(multiply(sumdiv, exponentiate(x, 2)-1), exponentiate(x-1, MOD-2));
        }
        fprintf(fo,"%lld %lld\n", numdiv, sumdiv);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}