Browse Source

C program looks like it works

main
Titouan Rigoudy 11 years ago
parent
commit
7e42d6886e
2 changed files with 69 additions and 4 deletions
  1. +22
    -0
      arithmetic_progressions/ap.test
  2. +47
    -4
      arithmetic_progressions/arithmetic_progressions.c

+ 22
- 0
arithmetic_progressions/ap.test View File

@ -0,0 +1,22 @@
7
0 0 0
0 1 0
1 1 0
1 1 1
2 1 1
1 2 1
1 2 2
13
0 1 1
0 2 2
0 3 3
0 4 4
0 5 5
0 6 6
0 7 7
1 2 2 1
0 2 2
1 3 3 1
0 3 3
0 2 3
0 2 4

+ 47
- 4
arithmetic_progressions/arithmetic_progressions.c View File

@ -5,6 +5,7 @@
#define INTS_START_SIZE 8
#define INTS_DELIM " \t\n"
#define BUF_SIZE 1024
#define BIG_MOD 1000003
size_t read_ints(char *str, int **ints) {
if (str == NULL) {
@ -60,11 +61,56 @@ int read_adp(int n, int (*adp)[3]) {
return 0;
}
int pow_mod(int a, int b, int mod, int acc) {
int powa = a % mod;
while (b > 0) {
if (b & 1) {
acc = (acc * powa) % mod;
}
powa = (powa * powa) % mod;
b >>= 1;
}
return acc;
}
int factorial_mod(int n, int mod, int acc) {
int i;
for (i = 2; i <= n; i++) {
acc = (acc * i) % mod;
}
return acc;
}
int min_const_diff(int n, int (*adp)[3], int i, int j) {
if (i < 1 || j > n) {
return 1;
}
int k = 0;
int v = 1;
int l;
for (l = i-1; l < j; l++) {
if (adp[l][2] > 0) {
k += adp[l][2];
if (adp[l][1] == 0) {
v = pow_mod(adp[l][0], adp[l][2], BIG_MOD, v);
} else {
v = pow_mod(adp[l][1], adp[l][2], BIG_MOD, v);
}
}
}
v = factorial_mod(k, BIG_MOD, v);
printf("%d %d\n", k, v);
return 0;
}
int add_powers(int n, int (*adp)[3], int i, int j, int v) {
if (i < 1 || j > n) {
return 1;
}
int k;
for (k = i-1; k < j; k++) {
adp[k][2] += v;
}
return 0;
}
@ -108,10 +154,6 @@ int main(int argc, char **argv) {
if (err) {
return 0;
}
int i;
for (i = 0; i < n; i++) {
printf("%d %d %d\n", adp[i][0], adp[i][1], adp[i][2]);
}
fgets(buf, BUF_SIZE, stdin);
int q = strtol(buf, &end, 10);
@ -119,6 +161,7 @@ int main(int argc, char **argv) {
return 0;
}
int i;
for (i = 0; i < q; i++) {
fgets(buf, BUF_SIZE, stdin);
err = handle_query(buf, n, adp);


Loading…
Cancel
Save