Cod sursa(job #1317067)

Utilizator tudorcomanTudor Coman tudorcoman Data 14 ianuarie 2015 15:16:12
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#define LL long long
#define MOD 9973
#define NMAX 1000005
using namespace std;
inline int lgput(int a,int b)
{
    if(b==0) return 1;
    else
    {
        int c = lgput(a,b/2);
        if(b&1)
            return c*c%MOD*a%MOD;
        else
            return c*c%MOD;
    }
}
bool ciur[NMAX];
int div[NMAX],k,n;
void ciuruiala ()
{
    for(int i=2; i<NMAX; ++i)
        if(ciur[i]==false)
        {
            div[++k] = i;
            for(int j = i+i; j<NMAX; j+=i)
                ciur[j]=true;
        }
}
struct VAR
{
    LL nrd,sd;
} ans;
int main()
{
    freopen ("ssnd.in","r",stdin);
    freopen ("ssnd.out","w",stdout);
    LL t;
    ciuruiala();
    scanf("%lld",&t);
    for(; t; --t)
    {
        scanf("%lld",&n);
        ans.nrd=1;
        ans.sd=1;
        for(int i = 1; i <= k and div[i] * div[i] <= n; ++i)
        {
            if(n % div[i])
                continue;
            int exp = 0;
            while(n % div[i] == 0)
            {
                n /= div[i];
                ++exp;
            }
            ans.nrd *= (exp+1);
            int p1 = (lgput(div[i], exp+1) - 1) % MOD;
            int p2 = lgput(div[i]-1, MOD-2) % MOD;

            ans. sd = (((ans.sd * p1) % MOD) * p2) % MOD;
        }

        if(n > 1)
        {
            ans.nrd *= 2;
            ans.sd = (ans.sd*(n+1) % MOD);
        }
        printf("%lld %lld\n",ans.nrd,ans.sd);
    }
    return 0;
}