Cod sursa(job #2336126)

Utilizator AlexandruPaulSirbu Alex AlexandruPaul Data 4 februarie 2019 20:06:53
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
const int supp=1e6+5;
const int mod=9973;
const int Maxx=1e6+5;
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;i<supp;++i){
        if (!prim[i]){
            nr[++tot]=i;
            for (int 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;
}
long long a;
int main() {
    fin>>test;
    ciur();
    for(;test;--test){
        fin>>a;
        int sum=1,nrd=1;
        for (int i=1;i<=tot && 1LL*nr[i]*nr[i]<=a;++i){
            if (a%nr[i]==0){
                int exp=0;
                while (a%nr[i]==0){
                    a/=nr[i];
                    ++exp;
                }
                nrd*=(exp+1);
                int s1=(pow(nr[i],exp+1)-1)%mod;
                int s2=pow(nr[i]-1,mod-2)%mod;
                sum=(((sum*s1)%mod)*s2)%mod;
            }
        }
        if (a>1){
            nrd*=2;
            sum=(1LL*sum*(a+1))%mod;
        }
        fout<<nrd<<" "<<sum<<"\n";
    }
    return 0;
}