// data[] - входные данные, n - их количество.
vector<int> a;
a.reserve(n-1);
for (i = 1; i < n; ++i) a.push_back(data[i] - data[i-1]);
// считаем префикс функцию для строки a.
vector<int> p(n-1);
k = 0;
for (i = 1; i < n-1 ;++i) {
while (k > 0 && a[k] != a[i]) k = p[k-1];
if (a[k] == a[i]) ++k;
p[i] = k;
}
int period = n-1;
if (p[n-2] >= (n-1)/2) period = n - 1 - p[n-2];
// ваш паттерн - a[0..period-1]
Юзай формулу
Второе условие - это база, когда роздано 0 типов карт. В этом случае перевеса нет и у первого игрока 0 карт. Т.е. условие t==0 && i==0. Тогда ответ 1. Иначе - 0.