Cod sursa(job #1855144)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 23 ianuarie 2017 14:32:37
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>
#include <fstream>
using namespace std;

int q[1000],npr[500000],vp=0,baza=9973;
char used[1001000];

int invm(int a,int n)
{
    //ma bazez pe q global ca sa nu mai pierd timp la alocarea la intrarea in fctzie
    int i=0,x=1,y=0,r,aux,b=n;
    while(b)
    {
        q[++i]=a/b;
        r=a%b;
        a=b;
        b=r;
    }
    while(i)
    {
        aux=y;
        y=x-q[i--]*y;
        x=aux;
    }
    if(x<0)return (n+x)%n;
    return x;
}

int rplog(int a,int b,int n)
{
    a%=n;
    int p=a,pr=1;
    while(b)
    {
        if(b%2) pr=((long long)pr*p)%n;
        p=((long long)p*p)%n;
        b/=2;
    }
    return pr;
}

void ciur()
{
    int k=1,lmax=1000900,p;
    used[0]=used[1]=1;
    while(k<=lmax)
    {
        while(used[k]&&k<=lmax)k++;
        npr[++vp]=k;
        p=2;
        while(p*k<=lmax)
        {
            used[p*k]=1;
            p++;
        }
        k++;
    }
}

void descfp(long long n,int &nf,int &sf)
{
    nf=1;
    sf=1;
    int id=1,p;
    while((long long)npr[id]*npr[id]<=n)
    {
        if(n%npr[id]==0)
        {
            p=0;
            while(n%npr[id]==0)
            {
                n/=npr[id];
                p++;
            }
            nf=((long long)nf*(p+1))%baza;
            int numarator=rplog(npr[id],p+1,baza)-1;
            int numitor=invm(npr[id]-1,baza);
            sf=((long long)sf*numarator%baza*numitor)%baza;
        }
        id++;
    }
    if(n!=1)
    {
        nf=((long long)nf*2)%baza;
        sf=((long long)sf*(rplog(n,2,baza)-1)*invm(n-1,baza))%baza;
    }
    if(sf<0)sf=sf+baza;
}

int main()
{
    FILE *f=fopen("ssnd.in","r");
    //ifstream f("ssnd.in");
    FILE *f1=fopen("ssnd.out","w");
    ciur();
    long long x;
    int nf,sf,n,i;
    fscanf(f,"%d",&n);
    //f>>n;
    for(i=1; i<=n; i++)
    {
        //f>>x;
        fscanf(f,"%lld",&x);
        descfp(x,nf,sf);
        fprintf(f1,"%d %d\n",nf,sf);
    }
    return 0;
}