Cod sursa(job #1061243)

Utilizator andreeadeacAndreea Ioana Deac andreeadeac Data 19 decembrie 2013 14:57:52
Problema Sum Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
using namespace std;
ifstream f("sum.in");
ofstream g("sum.out");

const int N=100000;
int e[N+1],c[N+1];

int main()
{
    /*cout << "Hello world!" << endl;
    1)daca y este prim cu x si y<x, atunci y+x este prim cu x
    2)daca y este prim cu x si y>x, atunci y-x este prim cu x
    3)daca y este prim cu x si y<x, atunci x-y este prim cu x

    (3) => fiecare y prim cu x, y<x are un complementar y-x prim cu x => suma numerelor y<x, prime cu x este x*e[x]/2
    fie y prim cu x, mai mic ca x si z=y-x perechea lui y. Atunci y + x si z + x sunt si ele prime cu x (*)
    invers: pentru fiecare t prim cu x, x < t < 2*x, t-x este prim cu x si 0 < t-x < x (**)

    din (*) si (**) => toate numerele prime cu x , t, din intervalul (x, 2*x) sunt de forma y+x, unde y este prim cu x, din (0,x)

    => suma numerelor prime cu x din (x, 2*x) este 3*x*e[x]/2

    suma ceruta este 2*x*e[x]


    (a,b) = cmmdc al numerelor a si b este un numar d cu proprietatile:
    1) d|a si d|b
    2) oricare ar fi d2 cu d2|a si d2|b, avem d2|d
    */

    int n,i,j;
    f>>n;
    for(i=2;i<=N;i++)
        e[i]=i;
    for(i=2;i<=N;i++)
        if(e[i]==i)
            for(j=i;j<=N;j+=i)
                e[j]=e[j]/i*(i-1);
    for(i=1;i<=n;i++)
        f>>c[i];
    for(i=1;i<=n;i++)
        g<<2*c[i]*e[c[i]]<<"\n";
    return 0;
}