做的时候只知道把表打出来,不知道怎么去找等差数列。
做法直接枚举公差和首项即可。
AC代码:
/* ID: 123 PROG: ariprog LANG: C++ */ #include <cstdio> #include <string.h> const int MAX_NUMBER = 250 * 250 * 2 + 3; bool vis[MAX_NUMBER]; int n, m; void init() { for (int i = 0; i <= m; i++) { for (int j = 0; j <= m; j++) { vis[i * i + j * j] = true; } } } bool isAr(int first, int difference) { for (int i = 0; i < n; i++) { if (!vis[first + i * difference]) { return false; } } return true; } int main() { FILE *in = fopen("ariprog.in", "r"); FILE *out = fopen("ariprog.out", "w"); fscanf(in, "%d%d", &n, &m); memset(vis, 0, sizeof(vis)); init(); int max_difference = m * m * 2; int flag = 0; for (int difference = 1; difference <= max_difference; difference++) { for (int first = 0; first + (n - 1) * difference <= max_difference; first++) { if (isAr(first, difference)) { fprintf(out, "%d %d\n", first, difference); flag = 1; } } } if (!flag) { fprintf(out, "NONE\n"); } return 0; }