Cod sursa(job #3259037)

Utilizator SanduCatalinSandu Catalin SanduCatalin Data 24 noiembrie 2024 19:45:45
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include<iostream>
#include<fstream>
#include<vector>
#define LL long long
#define mod 9973
using namespace std;

vector<LL> nrs(1000001,1),prs;

LL ppow(LL x,LL p){
    LL pp=1;
    while(p){if(p&1){pp=(pp*x)%mod;}x=(x*x)%mod;p>>=1;}
    return pp;
}

void sol(LL n,LL &nr, LL &s){
    LL d;
    for(d=0;prs[d]*prs[d]<=n;d++){if(!(n%prs[d])){
            LL pd=0;while(!(n%prs[d])){pd++;n/=prs[d];}
            nr*=pd+1;
            s=((s%mod)*(((ppow(prs[d],pd+1)-1+mod)%mod*(ppow(prs[d]-1,mod-2)%mod))%mod))%mod;
        }
    }if(n>1){nr<<=1;s=((s%mod)*(((ppow(n,2)-1+mod)%mod*(ppow(n-1,mod-2)%mod))%mod))%mod;}
}

int main(){
    ifstream in("ssnd.in");ofstream out("ssnd.out");nrs[0]=0,nrs[1]=0;
    LL n,s,nr;in>>n;for(n=2;n<=1000000;n++){if(nrs[n]){prs.push_back(n);
        for(s=2*n;s<=1000000;s+=n){nrs[s]=0;}}}
    while(in>>n){s=1,nr=1;
        sol(n,nr,s);out<<nr<<" "<<s<<endl;
    }
}