Cod sursa(job #1957253)

Utilizator mateibanuBanu Matei Costin mateibanu Data 7 aprilie 2017 13:53:17
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>

using namespace std;

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

#define MAX 1000010
#define ll long long
#define MOD 9973

int v[MAX];

ll nr;

void ciur(){
    ll d,i;
    v[1]=1;
    for (d=2;d<=MAX;d++)
        if (!v[d])
            for (i=2;i*d<=MAX;i++) v[i*d]=1;
    d=0;
    for (i=1;i<=MAX;i++)
        if (!v[i]) v[++d]=i;
    nr=d;
}

ll inv(ll n, ll p){
    if (n==0) return 1;
    if (n==1) return p;
    ll s=inv(n/2,p);
    s=s*s%MOD;
    if (n%2) s=s*p%MOD;
    return s;
}

int main()
{
    ll t,n,nrd,i,d,z,p,psus,pjos;
    ciur();
    fscanf(f,"%lld",&t);
    while (t){
        t--;
        fscanf(f,"%lld",&n);
        nrd=1;psus=1;pjos=1;
        for (i=1;i<=nr&&n>1;i++){
            d=0;z=1;
            while (n%v[i]==0){
                n/=v[i];z*=v[i];
                d++;
            }
            if (d) {pjos=pjos*(v[i]-1)%MOD;z*=v[i];psus=psus*(z-1)%MOD;}
            nrd*=(d+1);
        }
        psus=psus*inv(MOD-2,pjos)%MOD;
        fprintf(g,"%lld %lld\n",nrd,psus);
    }
    fclose(f);
    fclose(g);
    return 0;
}