Cod sursa(job #2336095)

Utilizator AlexandruPaulSirbu Alex AlexandruPaul Data 4 februarie 2019 19:46:52
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
using namespace std;
const int supp=1e6+1;
const int mod=9973;
const int Maxx=1e6+1;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bool prim[supp+3];
int nr[Maxx];
int tot;
int test;
void ciur(){
    prim[0]=1;
    prim[1]=1;
    for (int i=2,j;i<supp-1;++i){
        if (!prim[i]){
            nr[++tot]=i;
            for (j=i+i;j<supp;j+=i) prim[j]=1;
        }
    }
}
int pow(int a,int b){
    if (b!=1){
        if (b%2==0) return pow(a*a%mod,b/2)%mod;
        else return a*pow(a*a%mod,b/2)%mod;
    }
    return a;
}
int i,exp,a;
int sum=1,nrd=1;
int main() {
    fin>>test;
    ciur();
    int s1,s2;
    for(;test;--test){
        fin>>a;
        sum=nrd=1;
        for (i=1;i<=tot && 1LL*nr[i]*nr[i]<=a;++i){
            if (a%nr[i]==0){
                exp=0;
                while (a%nr[i]==0){
                    a/=nr[i];
                    ++exp;
                }
                nrd*=(exp+1);
                s1=(pow(nr[i],exp+1)-1)%mod;
                s2=pow(nr[i]-1,mod-2)%mod;
                sum=((sum*s1)%mod*s2)%mod;
            }
        }
        if (a>1){
            nrd*=2;
            sum=(1LL*sum*(a+1));
        }
        fout<<nrd<<" "<<sum%mod<<"\n";
    }
    return 0;
}