Cod sursa(job #385206)

Utilizator cocoshilaClaudiu cocoshila Data 22 ianuarie 2010 11:48:11
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.04 kb
001.#include <stdio.h>
002.#include <math.h>
003.#include <string.h>
004. 
005. 
006.const char *fin = "fractii.in";
007.const char *fout = "fractii.out";
008. 
009. 
010.int vec[1000010];
011.typedef int bignum[15];
012. 
013. 
014.void set(bignum b, int n) {
015.     
016.memset(b, 0, sizeof(bignum));
017.     
018.if (!n) {
019.         
020.return;
021.     
022.}
023.     
024.while(n) {
025.         
026.b[++b[0]] = n % 10;
027.         
028.n /= 10;
029.     
030.}
031.}
032. 
033. 
034.void mult(bignum b, int x) {
035.     
036.int t = 0;int i ;
037.     
038.for (i = 1; i <= b[0]; ++i) {
039.         
040.b[i] = b[i] * x + t;
041.       
042.t = b[i] / 10;
043.         
044.b[i] %= 10;
045.     
046.}
047.     
048.while (t) {
049.       
050.b[++b[0]] = t % 10;
051.         
052.t /= 10;
053.   
054.}
055.}
056. 
057. 
058.void add(bignum b, bignum a) {
059.     
060.int t = 0;
061.     
062.if (a[0] > b[0]) {
063.         
064.b[0] = a[0];
065.     
066.}int i;
067.     
068.for (i = 1; i <= b[0]; ++i) {
069.         
070.b[i] += a[i] + t;
071.       
072.t = b[i] / 10;
073.         
074.b[i] %= 10;
075.     
076.}
077.     
078.if (t) {
079.       
080.b[++b[0]] = t;
081.     
082.}
083.}
084. 
085. 
086.void sub(bignum b, bignum a) {
087.     
088.int i,t = 0;
089.     
090.for(i = 1; i <= b[0]; ++i) {
091.         
092.if (a[i] + t > b[i]) {
093.             
094.b[i] = (10 + b[i] - a[i] - t) % 10;
095.             
096.t = 1;
097.         
098.} else {
099.             
100.b[i] -= a[i] + t;
101.             
102.t = 0;
103.         
104.}
105.     
106.}
107.     
108.while(!b[b[0]]) {
109.         
110.b[0]--;
111.     
112.}
113.}
114. 
115. 
116.void sum(int k, bignum rez) {
117.     
118.set(rez, 0);int i;
119.     
120.for ( i = 2; i <= k; ++i) {
121.         
122.if (vec[i] != -1) {
123.             
124.int d = k / i;
125.             
126.bignum g;
127.           
128.set(g, d);
129.             
130.mult(g, d);
131.             
132.if(vec[i] > -1) {
133.                 
134.mult(g, vec[i] + 1);
135.                 
136.add(rez, g);
137.             
138.} else {
139.                 
140.mult(g, -vec[i] - 1);
141.               
142.sub(rez, g);
143.             
144.}int j;
145.             
146.for (j = 2 * i; j <= k; j += i) {
147.                 
148.vec[j] -= (vec[i] + 1);
149.           
150.}
151.       
152.}
153.   
154.}
155.}
156. 
157. 
158.int main(){
159.     
160.FILE *f = fopen(fin, "rt");
161.     
162.int n;
163.     
164.fscanf(f, "%d", &n);
165.     
166.fclose(f);
167. 
168. 
169.     
170.f = fopen(fout, "wt");
171.     
172.bignum nn, re;
173.     
174.set(nn, n);
175.     
176.mult(nn, n);
177.     
178.sum(n, re);
179.     
180.sub(nn, re);
181.int i;
182.     
183.for(i = nn[0]; i > 0; --i) {
184.         
185.fprintf(f, "%d", nn[i]);
186.     
187.}
188. 
189. 
190.     
191.fclose(f);
192.     
193.return 0;
194.}