Cod sursa(job #1968168)

Utilizator darian2001Clodnischi Darian Antonio darian2001 Data 17 aprilie 2017 15:27:57
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <bits/stdc++.h>

using namespace std;

FILE* fin;FILE* fout;
short in_loc,out_loc;
char in_buff[4096],out_buff[4096];
char prim[1000001];
vector <int> factori;


void read_init(const char* nume){
    fin=fopen(nume,"r");
    in_loc=4095;
}
char read_ch(){
    in_loc++;
    if(in_loc==4096){
       in_loc=0;
       fread(in_buff,1,4096,fin);
       }
    return in_buff[in_loc];
}
long long read_u64(){
    long long numar;
    char c;
    while(!isdigit(c=read_ch()));
    numar=c-'0';
    while(isdigit(c=read_ch()))
        numar=numar*10+c-'0';
    return numar;
}
void write_init(const char* nume){
    fout=fopen(nume,"w");
    out_loc=0;
}
void write_ch(char c){
    if(out_loc==4096){
        out_loc=0;
        fwrite(out_buff,1,4096,fout);
    }
    out_buff[out_loc++]=c;
}
void write_u64(long long numar){
    if(numar<=9)write_ch(numar+'0');
    else{
        write_u64(numar/10);
        write_ch(numar%10+'0');
    }
}
void write_appendix(){
    fwrite(out_buff,1,out_loc,fout);
    fclose(fout);
}
void ciur_Eratosthenes(){
    factori.push_back(2);
    for(int i=3;i<=1000000;i+=2)
        if(prim[i]==0){
            for(int j=i*3;j<=1000000;j+=i*2)
                prim[j]=1;
            factori.push_back(i);
        }
}
long long lg_pow(long long base,long long exp){
    long long produs=1;
    for(exp=exp;exp>0;exp=exp/2){
        if(exp%2)produs=(produs*base)%9973;
        base=(base*base)%9973;

    }
    return produs;
}


void ssnd(long long nr){
    long long divizori=1,suma=1;
    for(int i=0;factori[i]*factori[i]<=nr;i++){
            long long p=0;
        if(nr%factori[i]==0){
            while(nr%factori[i]==0){
                p++;
                nr=nr/factori[i];
            }
        }
        divizori*=(p+1);
        suma=suma*((lg_pow(factori[i],p+1)-1)/(factori[i]-1));
        suma%=9973;
    }
    if(nr>1){
        divizori*=2;
        suma=suma*(nr+1)%9973;
    }
   write_u64(divizori);write_ch(' ');write_u64(suma);write_ch('\n');
}


short teste;
void citire(){
    long long x;
    for(short i=1;i<=teste;i++){
            x=read_u64();
        ssnd(x);
    }
}


int main(){
    read_init("ssnd.in");
    write_init("ssnd.out");
    teste=read_u64();
    ciur_Eratosthenes();
    citire();
    write_ch('\n');
    write_appendix();
}