Cod sursa(job #1465918)

Utilizator cristina_borzaCristina Borza cristina_borza Data 28 iulie 2015 11:53:30
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <bitset>
#include <vector>
#define DN 1000001
#define REST 9973
using namespace std;

bitset <1000004> ciur;
vector<int>::iterator it;
vector <int> prime;

void c() {
    for(int i=2; i<=DN; i++)
        if(!ciur[i]) {
            prime.push_back(i);
            for(int j=i+i; j<=DN;j+=i) ciur[j]=1;
        }
}

inline int pow(int x, int p) {
    int rez = 1;
    x %= REST;

    for(; p; p >>= 1) {
        if(p & 1) {
            rez *= x;
            rez %= REST;
        }
        x *= x;
        x %= REST;
    }

    return rez;
}


int main()
{
    int t,nd,sd,p,s,p1,p2;
    long long n,cn;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    c();
    for(scanf("%d",&t);t;t--) {
        scanf("%lld",&n);
        cn=n;
        nd=sd=1;
        for(it=prime.begin(); (long long)(*it)*(*it)<=n; it++)
            if(!(n%(*it))) {
                p=0,s=1;
                while(!(n%(*it))) {
                    n/=(*it);
                    p++;
                }
                nd*=(p+1);
                p1=(pow(*it,p+1)-1)%REST;
                p2=pow((*it)-1,REST-2)%REST;
                sd=(((sd*p1)%REST)*p2)%REST;
            }
        if(n > 1) {
            nd *= 2;
            sd = (1LL*sd*(n+1)%REST);
        }
        printf("%d %d\n",nd,sd);
    }
    return 0;
}