Cod sursa(job #431190)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 31 martie 2010 19:12:22
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <math.h>
using namespace std;
int m,numar,n,p,set,x,t,i,j,a[100000];
long long nr;
float prod;
bool prim[1000000];

int putere(int num,int p)
{
    int i,sol=1;
    for(i=0;(1<<i)<=p;++i)
    {
        if (((1<<i)&p)>0) sol=(sol*num)%m;
        num=(num*num)%m;
    }
    return sol;
}
int main()
{
    ifstream fi("ssnd.in");
    ofstream fo("ssnd.out");
    m=9973;
    n=0;
    for(i=2;i<=1000000;i++)
       if(!prim[i]) { a[++n]=i; for(j=2*i;j<=1000000;j+=i) prim[j]=1; }
    fi>>t;
    for(set=1;set<=t;set++)
    {
       fi>>nr;
       x=(int)sqrt(nr);
       prod=1; numar=1;
       i=1;
       for(i=1;i<=n&&a[i]<=x;i++)
       {
           p=0;
           while(nr%a[i]==0) { nr/=a[i]; p++; }
           prod*=((putere(a[i],p+1)-1)/(a[i]-1))%m;
           numar*=(p+1);
       }
       if(numar==(int)prod==1) fo<<"2 "<<nr+1<<"\n"; else
       fo<<numar<<" "<<(int)prod<<"\n";
    }
    fo.close();
    return 0;
}