2017-6-2
题目大意
一个等差数列是一个能表示成a, a+b, a+2b,…, a+nb (n=0,1,2,3,…)的数列。
在这个问题中a是一个非负的整数,b是正整数。写一个程序来找出在双平方数集合(双平方数集合是所有能表示成p的平方 + q的平方的数的集合,其中p和q为非负整数)S中长度为n的等差数列。
题解
枚举公差d,然后枚举a,判断是否能连成n项的等差数列
代码
/*
ID: zachery1
PROG: ariprog
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
#define MAXM2 180000
#define cin fin
#define cout fout
using namespace std;
ifstream fin("ariprog.in");
ofstream fout("ariprog.out");
bool f[MAXM2];
int seq[MAXM2], q = 0;
int n, m;
int main() {
cin >> n >> m;
memset(f, false, sizeof(f));
memset(seq, 0, sizeof(seq));
for (int i = 0; i <= m; i++) {
for (int j = i; j <= m; j++) {
f[i*i + j*j] = true;
}
}
for (int i = 0; i < 2*m*m; i++) {
if (f[i]) {
seq[q++] = i;
}
}
bool none = true;
int endb = (2*m*m) / (n-1);
for (int b = 1; b <= endb; b++) {//枚举公差b
for (int i = 0; i < q; i++) {
int a = seq[i];//枚举a
bool flag = true;
for (int k = 0; k < n; k++) {
if (a+k*b > 2*m*m || !f[a+k*b]) {
flag = false;
break;
}
}
if (flag) {
cout << a << " " << b << endl;
none = false;
}
}
}
if (none) cout << "NONE" << endl;
return 0;
}