Cod sursa(job #822528)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 23 noiembrie 2012 18:21:49
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>
#include<bitset>
#include<vector>
#include<utility>
#define M 9973
using namespace std;
vector<long long> prime;
bitset<1000005> P;
long long n,q,f;
long long i,j,t,k,p,sdiv,nrdiv,pp;
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%lld",&t);
    prime.push_back(2);
    for(i=3;i<=1000;i+=2)
    {
        if(!P[i])
        {
            prime.push_back(i);
            for(j=i*i;j<=500000;j+=2*i) P[j]=1;
        }
    }
    for(i=1001;i<=1000000;i+=2)
    {
        if(!P[i]) prime.push_back(i);
    }
    for(;t;t--)
    {
        scanf("%lld",&n); nrdiv=1; sdiv=1;
        for(vector<long long>::iterator it=prime.begin();it!=prime.end()&&((*it)*(*it))<=n;it++)
        {
            k=(*it);
            p=0;
            while(n%k==0)
            {
                p++;
                n=n/k;
            }
            if(p)
            {
                nrdiv*=p+1;
                nrdiv%=M;
                f=k%M; q=0; pp=1;
                for(i=1;i<=p+1;i++) {q+=pp; pp*=f;}
                sdiv*=q;
                sdiv%=M;
            }
        }
        if(n>1)
        {
            p=1; k=n;
            nrdiv*=p+1;
            nrdiv%=M;
            f=k%M; q=0; pp=1;
            for(i=1;i<=p+1;i++) {q+=pp; pp*=f;}
            sdiv*=q;
            sdiv%=M;
        }
        printf("%lld %lld\n",nrdiv,sdiv);
    }
    return 0;
}