Cod sursa(job #1644807)

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

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

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

inline void sieve()
{
    p[1]=2; k=1;
    kratos(2);
    for(int i=3;i<=nmax;i+=2)
        if(!is[i])
        {
            p[++k]=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,nrdiv,d,p1,p2,ok;
    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<=k && 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;
}