Cod sursa(job #767387)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 13 iulie 2012 14:05:22
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#include<bitset>
using namespace std;
bitset<1000010> P;
void read(),solve();
int i,j,k,m,prim[100000],t,v,val,sum,nr,cnt;
long long sup,sub,f;
int main()
{
    read();
    solve();
    return 0;
}
void read()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d",&t);
}
void solve()
{
    k=1;
    prim[1]=2;
    for(i=3;i<1000;i+=2)
        if(!P[i])
        {
            prim[++k]=i;m=2*i;
            for(j=i*i;j<=1000000;j+=m)P[j]=1;
        }
    for(i=1001;i<=1000000;i+=2)
        if(!P[i])
            prim[++k]=i;
    for(;t;--t)
    {
        scanf("%d",&val);
        v=val;
        sum=1;
        sup=1;
        sub=1;
        for(i=1;prim[i]<=v;i++)
        {
            nr=0;
            for(;!(v%prim[i]);v/=prim[i])nr++;
            cnt=prim[i];
            for(j=1;j<=nr;j++)cnt*=prim[i];
            if(nr){sup*=(cnt-1);sup%=9973;sub*=(prim[i]-1);sub%=9973;}
            sum*=(nr+1);

        }
        f=sup/sub;
        printf("%d %lld\n",sum,f);
    }
}