Cod sursa(job #1670173)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 31 martie 2016 15:18:08
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <vector>
#include <utility>
#include <cmath>
#include <bitset>
using namespace std;

FILE *f=fopen("ssnd.in","r");
FILE *g=fopen("ssnd.out","w");

#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define fs(n) fscanf(f,"%I64d",&n)
#define fp fprintf

vector < pair<int,int> > v;
#define nmax 1000010

bitset <nmax/2+1> p;
int prim[nmax/4];
int i,j,m;
long long x,s,nr,n;

int main()
{
    prim[0]=2;x=nmax;
    for(i=1; (((i*i)<<1)+(i<<1))<=x; ++i)
    {
        if(!p[i])
        {
            for(j=(((i*i)<<1)+(i<<1)) ; (j<<1) <=x; j+= (i<<1) +1 )
                p[j]=1;
        }
    }
    m=0;
    for(i=1; (i<<1)+1<nmax; ++i)
        if(!p[i])
            prim[++m]=(i<<1)+1;
    fs(n);
    for(i=1;i<=n;i++)
    {
        fs(x);
        v.clear();
        for( j=0; j<=m && x>1; ++j)
        if(x%prim[j]==0)
        {
            v.pb(mp(prim[j],1));
            x/=prim[j];
            while(x%prim[j]==0)
            {
                v.back().se++;
                x/=prim[j];
            }
        }
        if(x!=1)
            v.pb(mp(x,1));
        nr=1;
        s=1;
        for( j=0; j<v.size(); ++j)
        {
            nr*=v[j].se+1;
            s*=(pow(v[j].fi,v[j].se+1)-1)/(v[j].fi-1);
            s%=9973;
        }
        fp(g,"%I64d %I64d\n",nr,s);
    }
}