题意:
找所有满足以下条件的等差数列,先按公差排序,再按首项排序。
(1)每项都是两个数平方和
(2)长度为n
题解:
首先找到所有(两平方数和)并排序;
然后遍历,外循环是首项,内循环是第二项,得到公差,根据此公差在后面的数中若能再找到n-2个数 ,则满足条件。
Question:结构体定义放在全局变量后面竟然超时了; 放得靠前就不会???
/*
ID:jsntrdy1
PROG:ariprog
LANG: C++
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<fstream>
#include<algorithm>
using namespace std;
const int N=150000;//250*250*2
struct node{
int a1;
int d;
}w[N];
int pq[N];//记录平方数和是否存在
int t[N];//平方数和
int n,m;
int ans;//满足条件的等差数列的个数
int len;//平方数和 的个数
bool cmp(node a,node b)
{
return a.d<b.d||(a.d==b.d&&a.a1<b.a1);
}
int main()
{
ifstream fin("ariprog.in");
ofstream fout("ariprog.out");
fin>>n>>m;
for(int p=0;p<=m;p++)
{
for(int q=p;q<=m;q++)
{
pq[p*p+q*q]=1;
}
}
for(int i=0;i<N;i++)
{
if(pq[i])
t[len++]=i;
}
for(int i=0;i<len;i++)
{
for(int j=i+1;j<len;j++)
{
int dd=t[j]-t[i];
int k;
for(k=2;k<n;k++)
{
if(!pq[t[i]+dd*k])
break;
}
if(k==n)
{
w[ans].a1=t[i];
w[ans].d=dd;
ans++;
}
}
}
if (ans){
sort(w,w+ans,cmp);
for(int i=0;i<ans;i++)
fout<<w[i].a1<<' '<<w[i].d<<endl;
}
else
fout<<"NONE"<<endl;
fin.close();
fout.close();
return 0;
}