int superPow(int a, vector<int> &b) { if(a == 0 || a == MOD || b.empty()) return 0; if(a == 1) return 1; if(a > MOD) a %= MOD; auto remainderPattern = getRemainderPattern(a); int remainderIndex = getRemainderIndex(b, remainderPattern.size()); remainderIndex = (remainderIndex == 0) ? remainderPattern.size() : remainderIndex; return remainderPattern[remainderIndex-1]; }
RESULT calculateSuccessors(unsigned int p, unsigned int g) { char current[geneSize * 2 + 1]; char next[geneSize * 2 + 1]; char remainder[4]; RESULT result; int clen; int i; char c; char last = 0; int count = 0; int pos = 0; char gene1[geneSize + 1]; strcpy(current, validRemainders[p]); strcat(current, genes[g].geneString); clen = strlen(current); //fprintf(stderr, "Processing current: %s (p = %s, g = %s)\n", current, validRemainders[p], genes[g].geneString); //some combos of precursors and genes are invalid: if (clen > 3 && strncmp(current, "1111", 4) == 0) return zeroResult; if (clen > 3 && strncmp(current, "2222", 4) == 0) return zeroResult; if (clen > 2 && strncmp(current, "333", 3) == 0) return zeroResult; for (i = 0; i < clen; i++) { c = current[i]; if (c != last && last != 0) { next[pos++] = count + '0'; next[pos++] = last; count = 1; last = c; } else { count ++; if (last == 0) { last = c; } } } if (count == 3 || (count == 2 && last == '3')) { next[pos++] = count + '0'; next[pos++] = current[clen - 1]; remainder[0] = '\0'; } else { for (i = 0; i < count; i++) { remainder[i] = c; } remainder[count] = '\0'; } next[pos] = '\0'; //fprintf(stderr, "Got next = %s, remainder = %s, looking up indexes...", next, remainder); result.remainderIndex = getRemainderIndex(remainder); // OK, now we need to translate "next" into two genes: if (pos > geneSize) { strncpy(gene1, next, geneSize); gene1[geneSize] = '\0'; result.geneIndex1 = getGeneIndex(gene1); result.geneIndex2 = getGeneIndex(next + (geneSize * sizeof(char))); } else { result.geneIndex1 = getGeneIndex(next); result.geneIndex2 = 0; } return result; }