#include #include #include typedef unsigned long long u64; typedef unsigned u32; typedef long long i64; #define error(...) \ do { \ printf("0\n"); \ printf(__VA_ARGS__); \ printf("\n"); \ exit(0); \ } while (0); int main(int, char* argv[]) { std::ifstream finp(argv[1]); std::ifstream frefp(argv[2]); std::ifstream foutp(argv[3]); i64 N, P, M; finp >> N >> P >> M; bool ref_possible; { i64 x; frefp >> x; ref_possible = x != -1; } i64 idx, val; foutp >> idx >> val; if (!foutp) { error("Could not parse output as two integers."); } if ((idx == -1) != (val == -1)) { error("Output %lld %lld is invalid.", idx, val); } bool out_possible = idx != -1 && val != -1; if (ref_possible != out_possible) { error("Output is %lld %lld but input %lld %lld %lld is %ssolvable.", idx, val, N, P, M, ref_possible ? "" : "not "); } if (!ref_possible) { puts("1\nCorrect!"); return 0; } if (idx < 1 || idx > N) { error("Output %lld %lld has invalid index (N=%lld).", idx, val, N); } if (val < 1 || val >= idx) { error("Output %lld %lld has invalid value (must be between 1 and %lld inclusive).", idx, val, idx - 1); } auto mul = [P](u32 a, u32 b) { return u64(a) * b % P; }; u32 FF = 1; for (i64 i = 2; i <= N && i <= 2 * P; ++i) { FF = mul(FF, i != idx ? i : val); } if (FF == M) { puts("1\nCorrect!"); } else { error("Output %lld %lld for input %lld %lld %lld results in incorrect remainder %u.", idx, val, N, P, M, FF); } }