Cod sursa(job #1957266)

Utilizator mateibanuBanu Matei Costin mateibanu Data 7 aprilie 2017 14:01:57
Problema Suma si numarul divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
#include <math.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-10;d++)
        if (!v[d])
            for (i=2;i*d<=MAX-10;i++) v[i*d]=1;
    /*d=0;
    for (i=1;i<=MAX-10;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;
        ll m=sqrt(n);
        for (i=1;i<=m&&n>1;i++)
        if (!v[i])
        {
            d=0;z=1;
            while (n%i==0){
                n/=i;z*=i;
                d++;
            }
            if (d) {pjos=pjos*(i-1)%MOD;z*=i;psus=psus*(z-1)%MOD;}
            nrd*=(d+1);
            if (!v[n]) {
                d=1;z=n;
                nrd*=(d+1);
                pjos=pjos*(n-1)%MOD;
                z*=n;
                psus=psus*(z-1)%MOD;
                n=1;
            }
        }
        psus=psus*inv(MOD-2,pjos)%MOD;
        fprintf(g,"%lld %lld\n",nrd,psus);
    }
    fclose(f);
    fclose(g);
    return 0;
}