反硬币操作与c无关,只与2和3的指数有关。设sg[i][j]为2和3的指数分别为i和j时,且前面的硬币都不可翻时的sg值。然后就可以枚举p,q,对于每一个p,q,它的sg值为 sg[i-k*q][j]的异或和以及sg[i][j-k*q]的异或和,求mex。
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 30005
using namespace std;
int p[maxn];
int n,mxq;
bool mark[500];
int sg[20][20];
void get_sg()
{
memset(sg,0,sizeof(sg));
for(int i=0;i<=15;i++)