Cod sursa(job #1343706)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 15 februarie 2015 20:06:38
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
#include <bitset>
#define MOD 9973
#define DIM 1000010
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
long long n,t;

bitset<DIM> viz;
vector<int> prim;

void ciur(){
    int i,j;
    prim.push_back(2);
    for(i=3;i<DIM;i+=2){
        if(!viz[i]){
            prim.push_back(i);
            for(j=i+i;j<=DIM;j+=i) viz[j]=1;
        }
    }
}

int up(int a,int b){
    if(b==1)
        return a%MOD;
    int q=up(a,b/2);
    q=((q%MOD)*(q%MOD))%MOD;
    if(b%2) q=(q*a)%MOD;
    return q;
}

int main(void){
    register int i,j,x,y,exp;
    int sol1,sol2;

    ciur();
    f>>t;
    for(;t>0;t--){
        f>>n;
        //nr divizorilor
        sol1=1,sol2=1;
        for(i=0;i<prim.size() && 1LL*prim[i]*prim[i]<=n && n!=1;i++){
            exp=1;
            while(n%prim[i]==0)
                n/=prim[i],exp++;
            sol1=(sol1*(exp%MOD))%MOD;

            x=up(prim[i],exp)-1;
            if(x<0) x+=MOD;
            y=up((prim[i]-1)%MOD,MOD-2);
            x=(x*y)%MOD;
            sol2=(sol2*x)%MOD;
        }
        if(n!=1){
            n%=MOD;
            sol1*=2;
            x=(n*n)%MOD-1;
            if(x<0) x+=MOD;
            y=up((n-1)%MOD,MOD-2);
            x=(x*y)%MOD;
            sol2=(sol2*x)%MOD;
        }
        g<<sol1<<" "<<sol2<<"\n";
    }
    f.close();
    g.close();
    return 0;
}