Cod sursa(job #1967423)

Utilizator darian2001Clodnischi Darian Antonio darian2001 Data 16 aprilie 2017 16:54:38
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 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(){
    for(int i=2;i<=1000000;i++)
        if(prim[i]==0){
            for(int j=i*2;j<=1000000;j+=i)
                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){
    vector <char> putere(1000001,0);
    int n;
    long long divizori=1,suma=1;
    for(int i=0;factori[i]<=nr;i++){
        if(nr%factori[i]==0){
                n=i;
            while(nr%factori[i]==0){
                putere[i]++;
                nr=nr/factori[i];
            }
        }
    }
    for(int i=0;i<=n;i++)
        divizori*=putere[i]+1,suma=(suma*(lg_pow(factori[i],putere[i]+1)-1)/(factori[i]-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_appendix();
}