Cod sursa(job #1650065)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 11 martie 2016 16:21:08
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>
#define nmax 1000005
#define mod 9973
using namespace std;

int n,k,nrp;
long long sum;
bitset<nmax> is;
int p[nmax];

inline void kratos(int nr)
{
    for(int i=nr; i<=nmax; i+=nr) is[i]=1;
}

inline void sieve()
{
    kratos(2); p[++nrp]=2;
    for(int i=3;i<=nmax;i+=2) if(!is[i]) { p[++nrp]=i; kratos(i); }
}

inline int power(int x,int po)
{
    int i,j,sol=1,a=x;
    for(i=0;(1<<i)<=po;i++)
    {
        if( (1<<i)&po ) sol=(1LL*sol*a)%mod;
        a=(1LL*a*a)%mod;
    }
    return sol;
}

int main()
{
    int i,j,sq,d,ok,nrdiv,p1,p2;
    long long nr;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d",&n);
    sieve();
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&nr);
        nrdiv=1; sum=1;
            for(j=1; j<=nrp && 1ll*p[j]*p[j]<=nr;j++)
            if(nr%p[j]==0)
            {
                d=0;
                while(nr%p[j]==0) { d++; nr/=p[j]; }
                nrdiv*=(d+1);
                p1=(power(p[j],d+1)-1)%mod;
                p2=(power(p[j]-1,mod-2))%mod;
                sum=(((sum*p1)%mod)*p2)%mod;
            }
        if(nr>1)
        {
            nrdiv*=2;
            sum=(1LL*sum*(nr+1)%mod);
        }
        printf("%d %d\n",nrdiv,sum);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}