Cod sursa(job #812517)

Utilizator costyv87Vlad Costin costyv87 Data 13 noiembrie 2012 22:35:50
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <math.h>
#include <fstream>
#define md  9973
using namespace std;
int dx[8]={-1,-1,0,+1,+1,+1,0,-1};
int dy[8]={0,+1,+1,+1,0,-1,-1,-1};
FILE *f,*g;
int t,i,nr;
long long n;
int pr[80000];
int cn,sol1,sol2,lim,nr1,nr2,q;


char p[1000000];

void ciur(int n)
{
  int i, j;
  for (i = 1; ((i * i) << 1) + (i << 1) <= n; i += 1) {
    if ((p[i >> 3] & (1 << (i & 7))) == 0) {
      for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= n; j += (i << 1) + 1) {
        p[j >> 3] |= (1 << (j & 7));
      }
    }
  }
  pr[nr=1]=2;
  for (i = 1; 2 * i + 1 <= n; ++i)
       if ((p[i >> 3] & (1 << (i & 7))) == 0)
           pr[++nr]=2*i+1;
}


int ridic(int x, int put)
{
    int sl=1,p=(x%md);

    for (;put;put>>=1,p=(p*p)%md)
        if (put&1)
        {
            sl=(sl*p)%md;
        }

    return sl;
}


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

    ciur(1000010);

    fin>>t;
    for (q=1;q<=t;q++)
    {
        fin>>n;
        sol1=sol2=1;
        for (i=1;n!=1 && (long long)pr[i]*pr[i]<=n && i<=nr;i++)
            if (n%pr[i]==0)
            {
                cn=0;
                while (n%pr[i]==0)
                {
                    cn++;
                    n=(long long)n/pr[i];
                }
                sol1=(sol1*(cn+1));

                nr1=(ridic(pr[i],cn+1)-1)%md;
                nr2=ridic(pr[i]-1,md-2);

                sol2=(((sol2*nr1)%md)*nr2)%md;
            }
        if (n!=1)
            {
                sol1=(sol1*2);
                sol2=(sol2*( (long long)(n+1)%md))%md;
            }
        fout<<sol1<<' '<<sol2<<'\n';
    }



	return 0;
}