Cod sursa(job #862630)

Utilizator lehman97Dimulescu David lehman97 Data 22 ianuarie 2013 20:21:55
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <math.h>
#include <bitset>


using namespace std;

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

const int n=1000000;
bitset <n> prim;
long long  x,nr2;
unsigned long long  b,nr,i,a,p,cnt=0,v[100000],cp,cp2;




void ciur()
{
    int i,j;
    v[1]=2;
    b=1;
    for (i=3;i<=1000;i+=2)
        if (prim[i]==0)
        {
            v[++b]=i;
            cnt++;
            for (j = 2*i;j<=n;j+=i)
                prim[j] = 1;
        }
    for(i=1001;i<=n;i+=2)
        if(prim[i]==0) v[++b]=i;
}


long long ridic(long long nn, long long put)
{
    int i;
    long long cn=nn,m,cr;
    cr=1;
    for(i=0;i<32;i++)
    {
        m=1<<i;
        if((m&put)==m)
        {
            cr=(cn*cr);
            cr%=9973;

        }
         cn=(cn*cn);
         cn%=9973;
    }
    return cr;
}




void desc()
{
    long long x,dv=1,sum=1;
    long long  i=0,d;
    long long  cnr=nr;

    for(i=1;i<=b,v[i]<=sqrt(cnr);i++)
    if(nr%v[i]==0)
    {

        d=1;
        while(nr%v[i]==0){d++;nr/=v[i];}
        cp=(ridic(v[i],d)-1)%9973;
        cp2=ridic(v[i]-1,9971)%9973;
        dv=(long long)(d*dv)%9973;
        sum=(sum%9973)*(cp%9973)*(cp2%9973)%9973;
    }
    if(nr>1)
    {
        dv=(dv*2)%9973;
        sum=((sum%9973)*((nr+1)%9973))%9973;
    }
    fprintf(g,"%lld ",dv);
    fprintf(g,"%lld\n",sum);
}



int main()
{
    b=0;
    ciur();
    fscanf(f,"%d",&a);
    for(i=1;i<=a;i++)
    {
         fscanf(f,"%lld",&nr);
         if(nr==1) fprintf(g,"%d %d\n",1,1);
         else if(nr<1000000 && prim[nr]==0 && (nr%2))
              fprintf(g,"%d% lld\n",2,(nr+1)%9973);
         else desc();
    }


    fclose(g);
    return 0;
}