Cod sursa(job #922947)

Utilizator PatrikStepan Patrik Patrik Data 22 martie 2013 18:47:38
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
    #include<cstdio>
    #include<vector>
    #include<cmath>
    #include<fstream>
    using namespace std;
    #define LIM 1000001
    #define MOD 9973
    #define pb push_back
    int T , nr , s , pu ;
    long long d;
    long long N;
    vector<int>p;
    bool v[LIM];

    void ciur();
    long long pow(int a , int b);

    int main()
    {
        ciur();
        ifstream f("ssnd.in");
        ofstream g("ssnd.out");
        f>>T;
        for( int i = 1 ; i <= T ; ++i )
        {
            f>>N;
            nr = 1;
            s = 1;
            for(int j = 0 ; j < (int)p.size() && 1ll*p[j]*p[j] <= N; ++j)
            {
                pu = 1;
                while(N%p[j]==0)
                    N/=p[j],pu++;
                nr*=pu;
                s=(1ll*s*(pow(p[j],pu)-1)/(p[j]-1))%MOD;
            }
            if(N>1){
                nr*=2;
                s=(1ll*s*((N*N-1)/(N-1)))%MOD;}
            g<<nr<<" "<<s<<"\n";
        }
        return 0;
    }

    void ciur()
    {
        p.pb(2);
        for(int i = 3 ; i <= LIM ; i+=2 )
        {
            if(v[i])continue;
            p.pb(i);
            for(int j = i+i+i ; j <= LIM ; j+= i<<1 )
                v[j] = 1;
        }
    }

    long long pow(int a , int b)
    {
        long long rez = 1 , n = a;
        for(int i = 0 ; (1<<i) <= b ; ++i )
        {
            if((1<<i)&b)
                rez*=n;
            n*=n;
        }
        return rez;
    }