oj 1162
一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列。
在这个问题中a是一个非负的整数,b是正整数。写一个程序来找出在双平方数集合(双平方数集合是所有能表示成p2+q2的数的集合)S中长度为n的等差数列。输入包括两行,第一行为N要找的等差数列的长度(3≤ N≤25)。第二行是找到的双平方数p和q的上界M(0≤p,q≤M)。
输出一行或者多行,如果没有找到数列,输出NONE。否则输出一个整数对a b(这些行应该先按b排序再按a排序)
样例1
输入:
5
7
输出:
1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24
主要还是暴力。。。。。。。。。
Step 1:
预处理所有的数挑出所有的平方数;
Step 2:
从平方数中循环 首相;
再循环等差; 截出长度。。。。;
再另开一个记录a&b的数组;
Step 3:
判断输出就666了;
ATTENTION :关键在于看懂题@注意数列中的每一项都得是平方数
OK paste code
#include<iostream>
#include<cstring>
using namespace std;
bool is[125001];
int a[125001];
int main()
{
int n,m;
cin>>n>>m;;
for (int i=0;i<=m;++i)
for (int j=0;j<=m;++j)
is[i*i+j*j]=1;
int k=0;
for(int i=0,z=m*m*2;i<=z;++i)
if(is[i])
a[k++]=i;
int l=1, ma=(m*m*2-0)/(n-1);
int nu=0;
for (;l <=ma;++l)
{
for(int i=0;a[i]+(n-1)*l<=m*m*2&&i<k;++i)
{
bool f=1;
for (int j=1;j<n&&f;++j)
if(!is[a[i]+j*l])
{
f=0;
}
if(f)
{
cout<<a[i]<<' '<<l;
++nu;
}
}
}
if (!nu)
puts("NONE");
return 0;
}