Cod sursa(job #2498381)

Utilizator MihneaGhiraMihnea MihneaGhira Data 23 noiembrie 2019 20:47:05
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
#include<bitset>
#define MOD 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
long long i,nr,T,k,p,n,a,b,s,m;
long long prime[100000],divizori[50],puteri[50];
bitset <1001010> v;
int pow (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;

    prime[++p]=2;
    for(int i=3;i<=1001000;i+=2){
        if(v[i]==0)
            prime[++p]=i;
        for(long long j=i+i+i;j<=1001000;j+=(i<<1))
            v[j]=1;
      }


    for(int t=1;t<=T;t++){
        fin>>n; m=n;

        int j=1;
        k=0;

        while(m!=1 && prime[j]*prime[j]<=m){
            if(m%prime[j]==0){
                divizori[++k]=prime[j];
                while(m%prime[j]==0){
                    m/=prime[j];
                    puteri[k]++;
                }
            }
            j++;
        }
        if(m!=1){
            divizori[++k]=m;
            puteri[k]++;
        }

        nr=1;
        for(i=1;i<=k;i++)
            nr = (nr*(puteri[i]+1))%MOD;
        fout<<nr<<" ";

        s=1;
        for(i=1;i<=k;i++){
            a=pow(divizori[i], puteri[i]+1);
            a--;
            if(a<0)
                a+=MOD;
            b=divizori[i]-1;
            s*=(a * pow(b, MOD-2))%MOD;
            s%=MOD;
        }
        fout<<s<<"\n";
        for(i=1;i<=k;i++)
            puteri[i]=0;
    }
    return 0;
}