Cod sursa(job #2163945)

Utilizator bodea.georgianaBodea Georgiana bodea.georgiana Data 12 martie 2018 20:41:10
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <stdio.h>
#include <iostream>

using namespace std;
FILE *f,*g;

int prime[79000],nrd=1,sd=0,mod=9973,n;
bool v[1000009];

void ciur()
{
    int i,j;
    for(i=2;i<=1000009;++i)
    {
        if(v[i]==0)
        {
            prime[++prime[0]]=i;
            for(j=2*i;j<=1000009;j=j+i)
                v[j]=1;
        }
    }
}

int putere(int nr,int put)
{
    int i,prod=1;
    for(i=1;i<=put+1;++i)
        prod=(prod*prime[nr]%mod)%mod;
    if(prod<=1)
        prod=mod+prod%mod;
    --prod;

    return prod;
}

void invmod(int a,int b, long long &x, long long &y)
{
    long long x0,y0;
    if(!b)
        x=1,y=0;
    else
    {
        invmod(b,a%b,x0,y0);
        x=y0;
        y=x0-a/b*y0;
    }
}

void divizori(long long x)
{
    int i,p;
    long long xx,yy;
    for(i=1;prime[i]*(long long)prime[i]<=x;++i)
    {
        p=0;
        while(x%prime[i]==0)
        {
            ++p;
            x/=prime[i];
        }
        if(p)
        {
            nrd*=(p+1);
            sd=sd%mod;
            sd*=putere(i,p);
            invmod(prime[i]-1,9973,xx,yy);
            if(xx<=0)
                xx=mod+xx%mod;
            sd=(sd*(xx%mod))%mod;
        }
    }
    if(x>1)
    {
        nrd*=2;
        sd=(sd*(long long)(x+1)%mod);
    }
    fprintf(g,"%d %d\n",nrd,sd);
}


int main()
{
    int i;
    long long x;
    f=fopen("ssnd.in","r");
    g=fopen("ssnd.out","w");
    ciur();

    fscanf(f,"%d",&n);
    for(i=1;i<=n;++i)
    {
        nrd=1;
        sd=1;
        fscanf(f,"%lld",&x);
        divizori(x);
    }
    fclose(f);
    fclose(g);
    return 0;
}