Cod sursa(job #2495758)

Utilizator radugnnGone Radu Mihnea radugnn Data 19 noiembrie 2019 20:02:35
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define MOD 9973
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
long long i,prime[100000],divizori[50],exponenti[50],NUMAR,T,dim,pr,x,numarator,numitor,SUMA;
bitset <1001010> f;
void ciur(){
    prime[++pr]=2;
      for(int i=3;i<=1001000;i+=2){
        if(f[i]==0)
            prime[++pr]=i;
        for(long long j=i+i+i;j<=1001000;j+=(i<<1))
            f[j]=1;
      }
}
void factorizare(long long el){
    int indice=1;
    dim=0;
    long long d=prime[indice];
    while(el!=1 && d*d<=el){
        if(el%d==0){
            divizori[++dim]=d;
            while(el%d==0){
                el/=d;
                exponenti[dim]++;
            }
        }
        d=prime[++indice];
    }
    if(el!=1){
      divizori[++dim]=el;
      exponenti[dim]++;
    }

}
int lgpow (long long a, long long b){
    int sol=1;
    a%=MOD;
    while(b){
        if(b&1)
            sol=(sol*a) % MOD;
        a=(a*a) % MOD;
        b>>=1;
    }
    return sol;
}
int main(){
    fin>>T;
    ciur();
    while(T--){
    fin>>x;
    factorizare(x);
    NUMAR=1;
    for(i=1;i<=dim;i++)
        NUMAR = (NUMAR*(exponenti[i]+1))%MOD;
    fout<<NUMAR<<" ";

    SUMA=1;
    for(i=1;i<=dim;i++){
        numarator= lgpow(divizori[i], exponenti[i]+1);
        numarator--;
        if(numarator < 0)
            numarator+=MOD;
        numitor=divizori[i]-1;
        SUMA *= (numarator*lgpow(numitor, MOD-2))%MOD;
        SUMA%=MOD;
    }
    fout<<SUMA<<"\n";
    for(i=1;i<=dim;i++)
        exponenti[i]=0;
    }
    return 0;
}