Cod sursa(job #2497045)

Utilizator MihneaGhiraMihnea MihneaGhira Data 21 noiembrie 2019 23:34:24
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
#include<bitset>
#define MOD 9973
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
long long n, m;
long long T,rest,nr,a,b,p,k;
long long prime[1000010],divizori[1000010],puteri[1000010];
bitset<1000010> v;

int putere (long long a, long long b){
    int r=1;
    while(b){
        if(b%2==1)
            r=(r*a)%MOD;
        a=a*a%MOD;
        b/=2;
    }
    return r;
}

int main(){
    fin>>T;
    ///ciur
    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;
        for(int i=1;i<=k;i++)
            puteri[i]=0;
        k=0;
        int i=1;
        while(m!=1 && prime[i]*prime[i]<=m){
            if(m%prime[i]==0){
                divizori[++k]=prime[i];
                while(m%prime[i]==0){
                    m/=prime[i];
                    puteri[k]++;
                }
            }
            i++;
        }

        if(m!=1){
          divizori[++k]=m;
          puteri[k]++;
        }


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

        rest=1;
        for(i=1;i<=k;i++){
            a=putere(divizori[i], puteri[i]+1);
            a--;
            if(a<0)
                a+=MOD;

            b=divizori[i]-1;
            rest *= (a*putere(b, MOD-2))%MOD;
            rest%=MOD;
        }

        fout<<rest<<"\n";
    }
    return 0;
}