Cod sursa(job #1957367)

Utilizator mateibanuBanu Matei Costin mateibanu Data 7 aprilie 2017 15:15:58
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <math.h>
#include <bitset>

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];
bitset<MAX> b;
ll nr;

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

inline ll inv(ll n, ll p){
    ll i,s=1;
    for (i=0;1<<i<=n;i++){
        if ((1<<i)&n) s=(s*p)%MOD;
        p=(p*p)%MOD;
    }
    return s;
    /*p%=MOD;
    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();
    //for (i=1;i<=nr;i++) printf("%d ",v[i]);
    //printf("%d",nr);
    fscanf(f,"%lld",&t);
    while (t){
        t--;
        fscanf(f,"%lld",&n);
        nrd=1;psus=1;pjos=1;
        ll m=n;
        i=1;
        while (n>1&&v[i]*v[i]<=m)
        {
            d=0;
            while (n%v[i]==0){
                n/=v[i];
                d++;
            }
            if (d) {pjos=pjos*inv(MOD-2,v[i]-1)%MOD;z=inv(d+1,v[i]);psus=psus*(z-1)%MOD;}
            nrd*=(d+1);
            i++;
        }
        if (n>1) {psus=psus*(n+1)%MOD;nrd*=2;}
        psus=psus*pjos%MOD;
        fprintf(g,"%lld %lld\n",nrd,psus);
    }
    fclose(f);
    fclose(g);
    return 0;
}