Cod sursa(job #969697)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 5 iulie 2013 01:44:26
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
#include<bitset>
#include<cstring>
using namespace std;
const int MOD = 9973;
const int NMAX = 1000000;
int T,i,j,P[NMAX/10],p,F[100],E[100],M,Numar;
long long N,Suma;
bitset<NMAX> viz;
void Ciur()
{
    P[++p]=2;
    for(i=3;i<=1000;i+=2)
        if(!viz[i])
        {
            P[++p]=i;
            for(j=i*i;j<=NMAX;j+=i) viz[j]=1;
        }
    for(;i<=NMAX;i+=2) if(!viz[i]) P[++p]=i;
}
long long Power(long long A,long long E)
{
    long long Rez=1;
    for(int i=1;i<=E;i<<=1)
    {
        if(i&E) Rez=(Rez*A)%MOD;
        A=(A*A)%MOD;
    }
    return Rez;
}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    Ciur();
    scanf("%d",&T);
    for(;T;T--)
    {
        scanf("%lld",&N); M=0; memset(E,0,sizeof(E));
        for(i=1;i<=p && P[i]*P[i]<=N;i++)
            if(N%P[i]==0)
            {
                F[++M]=P[i];
                while(N%P[i]==0) N/=P[i],E[M]++;
            }
        if(N>1) F[++M]=N,E[M]=1;
        Numar=Suma=1;
        for(i=1;i<=M;i++)
        {
            Numar=Numar*(E[i]+1);
            Suma=(Suma*(Power(F[i],E[i]+1)-1+MOD)%MOD*Power(F[i]-1,MOD-2)%MOD)%MOD;
        }
        printf("%d %lld\n",Numar,Suma);
    }
    return 0;
}