int main() { freopen("t.in", "r", stdin); int n; scanf("%d%d", &base, &n); int qh = 0, qt = 0; queue[qt ++] = State(BigInt(), BigInt(), 0); while(qh != qt) { const State &u = queue[qh]; qh = (qh + 1) % K_MAX; if(u.step == n) { if(u.val.num[u.step - 1] != 0) ans[ansCnt ++] = u.val; continue; } for(int d = 0; d < base; d ++) { BigInt v = u.val; v.len = u.step + 1; v.num[v.len - 1] = d; v.adjust(); BigInt r = u.sqr; r.num[2 * u.step] += d * d; r.adjust(); BigInt t = u.val; t = mul(t, 2 * d); t.shl(u.step); r = plus(r, t); r.adjust(); bool flag = false; for(int i = 0; i < u.step + 1; i ++) if(r.num[i] != v.num[i]) { flag = true; break; } if(!flag) { queue[qt] = State(v, r, u.step + 1); qt = (qt + 1) % K_MAX; } } } printf("%d\n", (n == 1) + ansCnt); for(int i = 0; i < ansCnt; i ++) { ans[i].output(); printf("\n"); } if(n == 1) printf("0"); }
BigInt mul(const BigInt &x, int k) { BigInt res = x; for(int i = 0; i < res.len; i ++) res.num[i] *= k; res.adjust(); return res; }
BigInt plus(const BigInt &a, const BigInt &b) { BigInt res; res.len = max(a.len, b.len); for(int i = 0; i < res.len; i ++) res.num[i] += a.num[i] + b.num[i]; res.adjust(); return res; }