Cod sursa(job #385203)

Utilizator Ionut_infoNicoara Ionut Ionut_info Data 22 ianuarie 2010 11:36:39
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h> 
#include <math.h> 
#include <string.h> 


const char *fin = "fractii.in"; 
const char *fout = "fractii.out"; 


int vec[1000010]; 
typedef int bignum[15]; 


void set(bignum b, int n) { 
    
memset(b, 0, sizeof(bignum)); 
    
if (!n) { 
        
return; 
    
} 
    
while(n) { 
        
b[++b[0]] = n % 10; 
        
n /= 10; 
    
} 
} 


void mult(bignum b, int x) { 
    
int t = 0;int i ; 
    
for (i = 1; i <= b[0]; ++i) { 
        
b[i] = b[i] * x + t; 
      
t = b[i] / 10; 
        
b[i] %= 10; 
    
} 
    
while (t) { 
      
b[++b[0]] = t % 10; 
        
t /= 10; 
  
} 
} 


void add(bignum b, bignum a) { 
    
int t = 0; 
    
if (a[0] > b[0]) { 
        
b[0] = a[0]; 
    
}int i; 
    
for (i = 1; i <= b[0]; ++i) { 
        
b[i] += a[i] + t; 
      
t = b[i] / 10; 
        
b[i] %= 10; 
    
} 
    
if (t) { 
      
b[++b[0]] = t; 
    
} 
} 


void sub(bignum b, bignum a) { 
    
int i,t = 0; 
    
for(i = 1; i <= b[0]; ++i) { 
        
if (a[i] + t > b[i]) { 
            
b[i] = (10 + b[i] - a[i] - t) % 10; 
            
t = 1; 
        
} else { 
            
b[i] -= a[i] + t; 
            
t = 0; 
        
} 
    
} 
    
while(!b[b[0]]) { 
        
b[0]--; 
    
} 
} 


void sum(int k, bignum rez) { 
    
set(rez, 0);int i; 
    
for ( i = 2; i <= k; ++i) { 
        
if (vec[i] != -1) { 
            
int d = k / i; 
            
bignum g; 
          
set(g, d); 
            
mult(g, d); 
            
if(vec[i] > -1) { 
                
mult(g, vec[i] + 1); 
                
add(rez, g); 
            
} else { 
                
mult(g, -vec[i] - 1); 
              
sub(rez, g); 
            
}int j; 
            
for (j = 2 * i; j <= k; j += i) { 
                
vec[j] -= (vec[i] + 1); 
          
} 
      
} 
  
} 
} 


int main(){ 
    
FILE *f = fopen(fin, "rt"); 
    
int n; 
    
fscanf(f, "%d", &n); 
    
fclose(f); 


    
f = fopen(fout, "wt"); 
    
bignum nn, re; 
    
set(nn, n); 
    
mult(nn, n); 
    
sum(n, re); 
    
sub(nn, re); 
int i; 
    
for(i = nn[0]; i > 0; --i) { 
        
fprintf(f, "%d", nn[i]); 
    
} 


    
fclose(f); 
    
return 0; 
}