Exemple #1
0
  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;
}