|
|
@ -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; |
|
|
} |
|
|
} |
|
|
|