Cod sursa(job #767406)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 13 iulie 2012 14:35:25
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include<bitset>
#define mod 9973
using namespace std;
bitset<1000010> P;
void read(),solve();
int i,j,k,m,prim[100000],t,Nr,f,sum,nr;
inline int pow(int,int);
long long v;
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("%lld",&v);
        sum=1;
        Nr=1;
        for(i=1;prim[i]*prim[i]<=v&&i<=k;i++)
        if(v%prim[i]==0)
        {
            nr=1;
            for(;!(v%prim[i]);v/=prim[i])nr++;
            Nr*=nr;
            f=((pow(prim[i],nr)+9972)*pow(prim[i]-1,9971))%mod;
            sum=(sum*f)%mod;

        }
        if(v-1)
        {
            Nr=2*Nr;
            v=(v+1)%mod;
            sum=(sum*(int)v)%mod;
        }
        printf("%d %d\n",Nr,sum);
    }
}
inline int pow(int B,int E)
{
    int ret=1;B%=mod;
    for(;E;E>>=1)
    {
        if(E&1)ret=(ret*B)%mod;
        B=(B*B)%mod;
    }
    return ret;
}