Cod sursa(job #2336110)

Utilizator AlexandruPaulSirbu Alex AlexandruPaul Data 4 februarie 2019 19:56:26
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
const int supp=1e6+5;
const int mod=9973;
const int Maxx=1e6+1;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bitset <supp> prim;
int nr[Maxx];
int tot;
int test;
void ciur(){
    prim[0]=1;
    prim[1]=1;
    for (int i=2,j;i<supp;++i){
        if (!prim[i]){
            nr[++tot]=i;
            for (j=i+i;j<supp;j+=i) prim[j]=1;
        }
    }
}
inline int pow(int a,int b){
    a%=mod;
    int ret=1;
    for (;b;b>>=1){
        if (b & 1){
            ret*=a;
            ret%=mod;
        }
        a*=a;
        a%=mod;
    }
    return ret;
}
int i,exp;
long long 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;
}