Cod sursa(job #1928889)

Utilizator andraSaceliAndra Saceli andraSaceli Data 16 martie 2017 20:57:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<cmath>
using namespace std;
const int MOD=9973;
bool c[1000005];
int v[200005],num;
inline long long my_pow(int a,int b)
{
    long long a1=a,p;
    for(p=1; b; b=b>>1)
    {
        if(b&1)
            p=p*a1;
        a1*=a1;
    }
    return p;
}
void ciur()
{
    c[0]=c[1]=1;
    for(int i=4; i<=1000000; i+=2)
        c[i]=1;
    for(int i=3; i<=1000; i+=2)
        if(c[i]==0)
            for(int j=i*i; j<=1000000; j+=2*i)
                c[j]=1;
    num=0;
    for(int i=2; i<=1000000; i++)
        if(c[i]==0)
            v[++num]=i;
}
int main()
{
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    int t,e;
    long long n,s,d,nrd,lim;
    ciur();
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        scanf("%lld",&n);
        lim=(long long)sqrt((double)n);
        s=1;
        d=1;
        nrd=1;
        while(n>1 && v[d]<=lim && d <= num)
        {
            e=0;
            while(n>0 && n%v[d]==0)
            {
                n=n/v[d];
                e++;
            }
            nrd=(nrd*(e+1))%MOD;
            if(e)
                s=(s*1LL*(my_pow(v[d],e+1)-1)/(v[d]-1))%MOD;
            d++;
        }
        if(n>1)
        {
            nrd=(nrd*2)%MOD;
            s=(s*1LL*(n*n-1)/(n-1))%MOD;
        }
        printf("%lld %lld\n",nrd,s);
    }
    return 0;
}