Cod sursa(job #1051292)

Utilizator rexlcdTenea Mihai rexlcd Data 9 decembrie 2013 21:48:49
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;

const int MAX_N=1000005;
const int MOD=9973;

ifstream f ("ssnd.in");
ofstream g ("ssnd.out");

long long n;
int t,k,p[MAX_N];
bitset <MAX_N> viz;

void ciur()
{
    int i,j;
    for (i=2;i<MAX_N;++i)
    {
        if(viz[i]==0)
        {
            p[++k]=i;
            for(j=i+i;j<MAX_N;j+=i)
               viz[j]=1;
        }
    }
}
inline int pow(int x,int p)
{
    int rez=1;
    x%=MOD;
    for (;p;p>>=1)
    {
        if (p & 1)
        {
            rez*=x;
            rez%=MOD;
        }
        x*=x;
        x%=MOD;
    }
    return rez;
}

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

       sdiv=(((sdiv*p1)%MOD)*p2)%MOD;
    }
    if(n>1)
    {
        nrdiv*=2;
        sdiv=(1LL*sdiv*(n+1)%MOD);
    }
    g<<nrdiv<<" "<<sdiv<<'\n';

}

int main()
{
    ciur();
    f>>t;
    for(int i=1;i<=t;i++)
        solve();
    return 0;
    f.close();
    g.close();
}