Cod sursa(job #1791437)

Utilizator Coroian_DavidCoroian David Coroian_David Data 29 octombrie 2016 13:09:07
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include <iostream>
 
#include <cstdio>
 
using namespace std;
 
FILE *f, *g;
 
bool p[1000001];
 
long long v[80001];
 
int k;
 
int n;
 
void euclid(int a, int b, int &x, int &y, int &d)
{
    if(b == 0)
    {
        x = 1;
 
        y = 0;
 
        d = a;
 
        return;
    }
 
    int xx, yy, q = a / b;
 
    euclid(b, a % b, xx, yy, d);
 
    x = yy;
 
    y = xx - yy * q;
 
}
 
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);
}
 
void poz(int &x, int n)
{
    if(x < 0)
    {
        if(-x < n)
            x += n;
 
        else
            if(-x >= n)
                x += (((-x) / n) + (((-x) % n) != 0)) * n;
    }
}
 
int power(int a, int b)
{
    int i, p = 1;
 
    for(i = 1; i <= b; i ++)
    {
        p *= a;
        p %= 9973;
    }
 
    return p;
}
 
void sumdiv(long long nr)
{
    long long sum, div, p, d, x, y = 1;
 
    sum = 1;
 
    div = 1;
 
    p = 0;
 
    d = 1;
 
    y = 1;
 
    while(d <= k && v[d] * v[d] * 1LL <= nr)
    {
        p = 0;
 
        while(nr % v[d] == 0)
        {
            nr /= v[d];
 
            p ++;
        }
 
        if(p != 0)
        {
 
            div *= (p + 1);
 
            x = (power(v[d], p + 1) - 1) ;
 
            y *= (v[d] - 1);
 
            y %= 9973;
 
 
            sum *= x;
 
         //   sum /= (v[d] - 1);
 
            sum %= 9973;
        }
        d ++;
    }
 
    if(nr > 1)
    {
        y *= (nr - 1);
 
        y %= 9973;
 
        sum *= ((nr % 9973) * (nr % 9973) - 1);
 
     //   sum /= (nr - 1);
 
        sum %= 9973;
 
        div *= 2;
    }
 
   // printf("%d\n", y);
 
    int i, rez = 0, j;
 
    euclid(y, 9973, rez, i, j);
 
    poz(rez, 9973);
 
    sum = sum * rez % 9973;
 
    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;
}