Cod sursa(job #1753899)

Utilizator alisavaAlin Sava alisava Data 7 septembrie 2016 12:01:48
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <bitset>
#define P 9973
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

bitset<1000005>a;
int p[150000],k=1;
void Ciur(int n)
{
    int i,j;
    for(i=4;i<=n;i=i+2)
        a[i]=1;
    for(i=3;(i-1)*(i-1)<=n;i=i+2)
        if(a[i]==0) for(j=i*i;j<=n;j=j+2*i) a[j]=1;
    for(i=2;i<=n;i++)
    if(a[i]==0) {p[k]=i;k++;}

}
int RidPutere(int a,int x)
{
    int prod=1;
    while(x!=0)
    {
        if(x%2==1)
        {
            x--;
            prod=(1LL*a*prod)%P;
        }
        a=(1LL*a*a)%P;
        x=x/2;
    }
    return prod;
}
int main()
{
    Ciur(1000000);
    int t,n,nrdiv=1,sumdiv=1,i,aux;
    int div=1;
    fin>>t;
    for(i=1;i<=t;i++)
    {
        fin>>n;
        nrdiv=1;
        sumdiv=1;
        aux=n;
        for(k=1;p[k]*p[k]<=n;k++)
        {
            if(n%p[k]==0)
            {
                div=1;
                n=n/p[k];
                while(n%p[k]==0)
                {
                    div++;
                    n=n/p[k];
                }
                nrdiv=nrdiv*(div+1);
                sumdiv=sumdiv*((RidPutere(p[k],div+1)-1)/(p[k]-1));
            }
        }
     fout<<nrdiv<<" "<<sumdiv<<"\n";
    }
    return 0;
}