Cod sursa(job #1928899)

Utilizator xtreme77Patrick Sava xtreme77 Data 16 martie 2017 21:11:16
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 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,d,lim;
    ciur();
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        scanf("%lld",&n);
        d=1;
        int nrd=1;
        int s = 0 ;
        while(n>1 && v[d] * v[d]<=lim && d <= num)
        {
        	long long keep = 1 ;
            e=0;
            while(n>0 && n%v[d]==0)
            {
                n=n/v[d];
                e++;
                keep = keep * v [d] ;
            }
            if(e) {
            	nrd=(nrd*(e+1))%MOD;
            	keep = keep * v [d] ;
                s=s*1LL*((keep - 1)/(v[d]-1))%MOD;
            }
            d++;
        }
        if(n>1)
        {
            nrd=(nrd*2)%MOD;
            s=s*1LL*((n*n-1)/(n-1))%MOD;
        }
        printf("%d %d\n",nrd,s);
    }
    return 0;
}