Cod sursa(job #579231)

Utilizator bogfodorBogdan Fodor bogfodor Data 11 aprilie 2011 22:32:28
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#define mult 1000005
#define mod 9973

using namespace std;

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

int t,k;
int e[mult],s[mult];
long long x;

inline void eratostene()
{
    for(int i=4;i<mult;i+=2)
        e[i]=1;
    s[++k]=2;
    for(int i=3;i<mult;i+=2)
        if(e[i]==0)
        {
            s[++k]=i;
            for(int j=i+i;j<mult;j+=i)
                e[j]=1;
        }
}

inline int pow(int x, int p)
{
    int r=1;
   // x%=mod;
    for(;p;p>>=1)
    {
        if(p&1)
        {
            r*=x;
           // r%=mod;
        }
        x*=x;
       // x%=mod;
    }
    return r%mod;
}

void solve(int n)
{
    int nr=1,sdiv=1;
    for(int i=1;i<=k && 1LL *s[i]*s[i]<=n;++i)
    {
        if(n%s[i])
            continue;
        int p=0;
        while(n%s[i]==0)
        {
            n/=s[i];
            ++p;
        }
        nr*=(p+1);
        int p1=(pow(s[i],p+1)-1)%mod;
        int p2=pow(s[i]-1,mod-2)%mod;
        sdiv=(((sdiv*p1)%mod)*p2)%mod;
    }
    if(n>1)
    {
        nr<<=1;
        sdiv=(1LL*sdiv*(n+1)%mod);
    }
    fout<<nr<<" "<<sdiv<<"\n";
}

int main()
{
    eratostene();
    fin>>t;
    while(t--)
    {
        fin>>x;
        solve(x);
    }
    return 0;
}