usaco_1.4.3

做的時候只知道把表打出來,不知道怎麼去找等差數列。

做法直接枚舉公差和首項即可。

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章