Browse Source

Moved to longs, added struct adp, changed strtok_r to strtok

main
Titouan Rigoudy 11 years ago
parent
commit
6502f6a60f
1 changed files with 32 additions and 23 deletions
  1. +32
    -23
      arithmetic_progressions/arithmetic_progressions.c

+ 32
- 23
arithmetic_progressions/arithmetic_progressions.c View File

@ -1,12 +1,21 @@
// https://www.hackerrank.com/challenges/arithmetic-progressions
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <ctype.h>
#define INTS_START_SIZE 8 #define INTS_START_SIZE 8
#define INTS_DELIM " \t\n" #define INTS_DELIM " \t\n"
#define BUF_SIZE 1024 #define BUF_SIZE 1024
#define BIG_MOD 1000003 #define BIG_MOD 1000003
struct adp {
long a;
long d;
long p;
};
size_t read_ints(char *str, int **ints) { size_t read_ints(char *str, int **ints) {
if (str == NULL) { if (str == NULL) {
return 0; return 0;
@ -18,9 +27,9 @@ size_t read_ints(char *str, int **ints) {
} }
size_t i = 0; size_t i = 0;
char *toksave, *end;
char *end;
long int tmp; long int tmp;
char *tok = strtok_r(str, INTS_DELIM, &toksave);
char *tok = strtok(str, INTS_DELIM);
while (tok != NULL) { while (tok != NULL) {
tmp = strtol(tok, &end, 10); tmp = strtol(tok, &end, 10);
if (*end == '\0' || isspace(*end)) { // valid number found if (*end == '\0' || isspace(*end)) { // valid number found
@ -36,12 +45,12 @@ size_t read_ints(char *str, int **ints) {
(*ints)[i] = tmp; (*ints)[i] = tmp;
i++; i++;
} }
tok = strtok_r(NULL, INTS_DELIM, &toksave);
tok = strtok(NULL, INTS_DELIM);
} }
return i; return i;
} }
int read_adp(int n, int (*adp)[3]) {
int read_adp(int n, struct adp *adp) {
char buf[BUF_SIZE]; char buf[BUF_SIZE];
int *ints; int *ints;
size_t ints_len; size_t ints_len;
@ -53,16 +62,16 @@ int read_adp(int n, int (*adp)[3]) {
if (ints_len != 3) { if (ints_len != 3) {
return 1; 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); free(ints);
} }
return 0; 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) { while (b > 0) {
if (b & 1) { if (b & 1) {
acc = (acc * powa) % mod; acc = (acc * powa) % mod;
@ -73,7 +82,7 @@ int pow_mod(int a, int b, int mod, int acc) {
return acc; return acc;
} }
int factorial_mod(int n, int mod, int acc) {
long factorial_mod(long n, long mod, long acc) {
int i; int i;
for (i = 2; i <= n; i++) { for (i = 2; i <= n; i++) {
acc = (acc * i) % mod; acc = (acc * i) % mod;
@ -81,40 +90,40 @@ int factorial_mod(int n, int mod, int acc) {
return 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) { if (i < 1 || j > n) {
return 1; return 1;
} }
int k = 0;
int v = 1;
long k = 0;
long v = 1;
int l; int l;
for (l = i-1; l < j; 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 { } 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); v = factorial_mod(k, BIG_MOD, v);
printf("%d %d\n", k, v);
printf("%ld %ld\n", k, v);
return 0; 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) { if (i < 1 || j > n) {
return 1; return 1;
} }
int k; int k;
for (k = i-1; k < j; k++) { for (k = i-1; k < j; k++) {
adp[k][2] += v;
adp[k].p += v;
} }
return 0; 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;
int ints_len = read_ints(str, &ints); int ints_len = read_ints(str, &ints);
if (ints_len < 1) { if (ints_len < 1) {
@ -146,7 +155,7 @@ int main(int argc, char **argv) {
return 0; return 0;
} }
int (*adp)[3] = malloc(3 * n * sizeof **adp);
struct adp *adp = malloc(n * sizeof *adp);
if (adp == NULL) { if (adp == NULL) {
return 0; return 0;
} }


Loading…
Cancel
Save