一个等差数列是一个能表示成 a, a + b, a + 2b, ..., a + n * b ( n = 0,1,2,3,... ) 的数列。在这个问题中a 是一个非负的整数, b 是正整数。写一个程序来找出在双平方数集合(双平方数集合是所有能表示成p 的平方 + q 的平方的数的集合,其中 p 和 q 为非负整数) S 中长度为 n 的等差数列。
枚举公差和初值,然后判断
#include <cstdio>
using namespace std;
const int MAX_N = 150000;
int N, M;
bool vis[MAX_N];
bool check(int a, int d)
{
if(d == 0) return d;
for (int i=0; i<=N-1; i++)
if(a + i*d > 2*M*M || !vis[a + i*d]) return 0;
return 1;
}
void doit(void)
{
int up_limit = M*M*2 / (N-1);
bool ok = 0; int d;
for (int i=0; i<=up_limit; i+=d){
for (int j=0; j<=2*M*M - (N-1)*i; j++){
if (check(j, i)){ ok = 1; printf("%d %d\n", j, i); }
}
}
if(!ok) printf("NONE\n");
return;
}
int main(void)
{
freopen("ariprog.in", "r", stdin);
freopen("ariprog.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i=0; i<=M; i++)
for (int j=0; j<=M; j++)
vis[i * i + j * j] = 1;
doit();
return 0;
}