Cod sursa(job #111558)

Utilizator damaDamaschin Mihai dama Data 30 noiembrie 2007 16:41:25
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <string.h>

int prime[160], div[16], isprime[318], cnt, sol, count, nr = 1;

void ciur();
void bkt(int);

int n, x;

int main()
{
    freopen("sum.in", "r", stdin);
    freopen("sum.out", "w", stdout);
    
    int i, j, aux;
    
    ciur();
    
    scanf("%d", &n);
    
    for(i = 1; i <= n; ++i)
    {
          scanf("%d", &x);
          aux = x;
          cnt = 0;
          sol = 0;
          for(j = 1; prime[j] * prime[j] <= x; ++j)
          {
                if(aux % prime[j] == 0)
                {
                       div[++cnt] = prime[j];
                       while(aux % prime[j] == 0)
                       {
                                 aux /= prime[j];
                       }
                }
          }
          if(aux)
          {
                 div[++cnt] = aux;
          }
          bkt(1);
          printf("%d\n", sol);  
    }
    
    return 0;
}

void ciur()
{
     int i, j;
     for(i = 2; i < 318; ++i)
     {
           if(!isprime[i])
           {
                    prime[++prime[0]] = i;   
                    for(j = 2 * i; j < 318; j += i)
                    {
                          isprime[j] = 1;
                    }
           }
     }
}
                 
void bkt(int k)
{
     if(k == cnt + 1)
     {
          long long temp = (long long) 2 * x / nr;
          temp *= temp + 1;
          temp /= 2;
          temp *= nr;
          if(count % 2 == 0)
          {
                   sol += temp;
          }
          else
          {
                   sol -= temp;
          }
     }
     else
     {
         bkt(k + 1);
         nr *= div[k];
         ++count;
         bkt(k + 1);
         --count;
         nr /= div[k];
     }
}