Cod sursa(job #812482)

Utilizator costyv87Vlad Costin costyv87 Data 13 noiembrie 2012 21:57:53
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <vector>
#include <math.h>
#include <string>
#include <bitset>
#include <algorithm>
#define PT(i,n) for(i=1;i<=n;i++)
#define md  9973
int dx[8]={-1,-1,0,+1,+1,+1,0,-1};
int dy[8]={0,+1,+1,+1,0,-1,-1,-1};
using namespace std;
FILE *f,*g;
int t,i,nr;
long long n;
int pr[80000];
int cn,sol1,sol2,lim,nr1,nr2,q;
bitset <1000100> bf;

void ciur(int x)
{
    int i,j;
    pr[++nr]=2;

    for (i=3;i<=x;i+=2)
        if (bf[i]==0)
        {
            pr[++nr]=i;
            if (i<=1005)
                for (j=i*i;j<=x;j+=2*i) bf[j]=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()
{
    f=fopen("ssnd.in","r");
    g=fopen("ssnd.out","w");

    ciur(1000010);

    fscanf(f,"%d",&t);
    PT(q,t)
    {
        fscanf(f,"%lld",&n);
        lim=sqrt(n)+1;
        sol1=sol2=1;
        for (i=1;n!=1 && pr[i]<=lim;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);
                if (nr1==0)  nr1=md-1; else nr1--;
                nr2=ridic(pr[i]-1,md-2);

                sol2=(sol2*( (nr1*nr2)%md))%md;
            }
        if (n!=1)
            {
                sol1=(sol1*2);
                nr1=ridic(n,2);
                if (nr1==0)  nr1=md-1; else nr1--;

                nr2=ridic(n-1,md-2);
                sol2=(sol2*( (nr1*nr2)%md))%md;
            }
        fprintf(g,"%d %d\n",sol1,sol2);
    }



	return 0;
}