From 6502f6a60f02904019f710c35321c14b3ddc6290 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Tue, 21 Oct 2014 15:45:52 -0400 Subject: [PATCH] Moved to longs, added struct adp, changed strtok_r to strtok --- .../arithmetic_progressions.c | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/arithmetic_progressions/arithmetic_progressions.c b/arithmetic_progressions/arithmetic_progressions.c index f76b2c0..496854a 100644 --- a/arithmetic_progressions/arithmetic_progressions.c +++ b/arithmetic_progressions/arithmetic_progressions.c @@ -1,12 +1,21 @@ +// https://www.hackerrank.com/challenges/arithmetic-progressions + #include #include #include +#include #define INTS_START_SIZE 8 #define INTS_DELIM " \t\n" #define BUF_SIZE 1024 #define BIG_MOD 1000003 +struct adp { + long a; + long d; + long p; +}; + size_t read_ints(char *str, int **ints) { if (str == NULL) { return 0; @@ -18,9 +27,9 @@ size_t read_ints(char *str, int **ints) { } size_t i = 0; - char *toksave, *end; + char *end; long int tmp; - char *tok = strtok_r(str, INTS_DELIM, &toksave); + char *tok = strtok(str, INTS_DELIM); while (tok != NULL) { tmp = strtol(tok, &end, 10); if (*end == '\0' || isspace(*end)) { // valid number found @@ -36,12 +45,12 @@ size_t read_ints(char *str, int **ints) { (*ints)[i] = tmp; i++; } - tok = strtok_r(NULL, INTS_DELIM, &toksave); + tok = strtok(NULL, INTS_DELIM); } return i; } -int read_adp(int n, int (*adp)[3]) { +int read_adp(int n, struct adp *adp) { char buf[BUF_SIZE]; int *ints; size_t ints_len; @@ -53,16 +62,16 @@ int read_adp(int n, int (*adp)[3]) { if (ints_len != 3) { return 1; } - adp[i][0] = ints[0]; - adp[i][1] = ints[1]; - adp[i][2] = ints[2]; + adp[i].a = ints[0]; + adp[i].d = ints[1]; + adp[i].p = ints[2]; free(ints); } return 0; } -int pow_mod(int a, int b, int mod, int acc) { - int powa = a % mod; +long pow_mod(long a, long b, long mod, long acc) { + long powa = a % mod; while (b > 0) { if (b & 1) { acc = (acc * powa) % mod; @@ -73,7 +82,7 @@ int pow_mod(int a, int b, int mod, int acc) { return acc; } -int factorial_mod(int n, int mod, int acc) { +long factorial_mod(long n, long mod, long acc) { int i; for (i = 2; i <= n; i++) { acc = (acc * i) % mod; @@ -81,40 +90,40 @@ int factorial_mod(int n, int mod, int acc) { return acc; } -int min_const_diff(int n, int (*adp)[3], int i, int j) { +int min_const_diff(int n, struct adp *adp, int i, int j) { if (i < 1 || j > n) { return 1; } - int k = 0; - int v = 1; + long k = 0; + long 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); + if (adp[l].p > 0) { + k += adp[l].p; + if (adp[l].d == 0) { + v = pow_mod(adp[l].a, adp[l].p, BIG_MOD, v); } else { - v = pow_mod(adp[l][1], adp[l][2], BIG_MOD, v); + v = pow_mod(adp[l].d, adp[l].p, BIG_MOD, v); } } } v = factorial_mod(k, BIG_MOD, v); - printf("%d %d\n", k, v); + printf("%ld %ld\n", k, v); return 0; } -int add_powers(int n, int (*adp)[3], int i, int j, int v) { +int add_powers(int n, struct adp *adp, 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; + adp[k].p += v; } return 0; } -int handle_query(char *str, int n, int (*adp)[3]) { +int handle_query(char *str, int n, struct adp *adp) { int *ints; int ints_len = read_ints(str, &ints); if (ints_len < 1) { @@ -146,7 +155,7 @@ int main(int argc, char **argv) { return 0; } - int (*adp)[3] = malloc(3 * n * sizeof **adp); + struct adp *adp = malloc(n * sizeof *adp); if (adp == NULL) { return 0; }