Cod sursa(job #1789275)

Utilizator Coroian_DavidCoroian David Coroian_David Data 26 octombrie 2016 20:45:56
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>

#include <cstdio>

using namespace std;

FILE *f, *g;

bool p[1000001];

long long v[80001];

int k;

int n;

void ciur()
{
    int n = 1000000;

    int i, j;

    p[0] = p[1] = 1;

    for(i = 4; i <= n; i += 2)
        p[i] = 1;

    for(i = 3; i * i <= n; i += 2)
        if(p[i] == 0)
            for(j = i * i; j <= n; j += i * 2)
                p[j] = 1;

    v[++ k] = 2;

    for(i = 3; i <= n; i += 2)
    {
        if(p[i] == 0)
            v[++ k] = i;
    }

    //printf("%d\n", k);
}

int power(int a, int b)
{
    int i, p = 1;

    for(i = 1; i <= b; i ++)
    {
        p *= a;
        p %= 9973;
    }

    return p;
}

void sumdiv(int nr)
{
    long long sum, div, p, d, x;

    sum = 1;

    div = 1;

    p = 0;

    d = 1;

    while(d <= k && v[d] * v[d] * 1LL <= nr)
    {
        p = 0;

        while(nr % v[d] == 0)
        {
            nr /= v[d];

            p ++;
        }

        div *= (p + 1);

        x = (power(v[d], p + 1) - 1) / (v[d] - 1);

        sum *= x;

        sum %= 9973;

        d ++;
    }

    if(nr > 1)
    {
        sum *= (nr % 9973 * nr % 9972 - 1) / (nr - 1);

        sum %= 9973;

        div *= 2;
    }

    fprintf(g, "%lld %lld\n", div, sum);
}

void readFile()
{
    f = fopen("ssnd.in", "r");
    g = fopen("ssnd.out", "w");

    int i;

    long long nr;

    fscanf(f, "%d", &n);

    for(i = 1; i <= n; i ++)
    {
        fscanf(f, "%lld", &nr);

        sumdiv(nr);
    }

    fclose(f);
    fclose(g);
}

int main()
{
    ciur();

    readFile();

    return 0;
}