Cod sursa(job #572583)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 5 aprilie 2011 14:17:40
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define Nmax 1000003
#define LL long long
#define Mod 9973
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

bool p[Nmax];
int P[80000];
int T;

inline void ciur(){
    int i,j;
    for(j=2*2; j<Nmax; j+=2 )
        p[j]=1;
    P[P[0]=1]=2;

    for(i=3; i<Nmax; i+=2 )
        if( !p[i] ){
            P[++P[0]]=i;

            if( 1LL*i*i < Nmax )
                for(j=i*i; j<Nmax; j+=i )
                    p[j]=1;
        }
}

inline int put(int a,int b){
    int i,p=a,rez=1;
    for(i=0;(1<<i)<=b;++i){
        if( b & (1<<i) ) rez=(rez*p)%Mod;
        p=(p*p)%Mod;
    }
    return rez;
}

inline void solve(LL X){
    int i;
    int nr=1, sum=1,n1,n2,e;

    for(i=1; i<=P[0] && 1LL*P[i]*P[i]<=X; ++i){
        if( X % P[i] ) continue;

        for( e=0; X%P[i]==0; ) e++, X/=P[i];
        nr *= (e+1);

        n1=put(P[i],e+1)-1;
        n2=put(P[i]-1,Mod-2);

        sum=(1LL*sum*n1*n2)%Mod;
    }

    if( X>1 ){
        nr *= 2;
        sum=(1LL*sum*(X+1))%Mod;
    }

    fout<<nr<<" "<<sum<<"\n";
}

int main(){
    int i,q; LL X;
    ciur();

    fin>>T;

    for(q=1;q<=T;++q){
        fin>>X;
        solve(X);
    }

    fin.close(); fout.close();
    return 0;
}