计蒜客-等差数列

一个等差数列是一个能表示成 a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)a,a+b,a+2b,...,a+nb(n=0,1,2,3,...)的数列。

在这个问题中 aa 是一个非负的整数,bb 是正整数。写一个程序来找出在双平方数集合(双平方数集合是所有能表示成 p^2+q^2p2+q2 的数的集合) SS 中长度为 nn 的等差数列。

输入格式

输入包括两行,第一行为 N(3 \leq N \leq 25)N(3N25) 要找的等差数列的长度。第二行是找到的双平方数 pp 和 qq 的上界 M(0 \leq p,q \leq M)M(0p,qM)。

输出格式

输出一行或者多行,如果没有找到数列,输出NONE。否则输出一个整数对a b(这些行应该先按 bb 排序再按 aa 排序)

样例输入

5
7

样例输出

1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2500;
bool in[maxn * maxn + 10];
int main()
{

    ios::sync_with_stdio(false), cin.tie(0);
    int N;
    cin >> N;
    int M;
    cin >> M;
    in[0] = 1;
    //预处理双平方数
    for (int i = 0; i <= M; i++)
    {
        for (int j = 0; j <= M; j++)
        {
            in[i * i + j * j] = 1;
        }
    }
    int max_i = M * M * 2;
    vector<pair<int, int> >res;
    int i;
    for (int a = 0; a <= max_i; a++)
    {   
        //因为a是一个常量在任何a+i*b=p^2+q^2成立所以i=0时也应成立所以a也应为双平方数,去掉也能ac但是时间会增加
        if (!in[a])continue;
        for (int b = 1; a + (N - 1)*b <= max_i; b++)
        {
            for (i = 0; i < N; i++)
            {
                if (!in[a + i * b])
                    break;
            }
            if (i == N)
                res.push_back(make_pair(b, a));
        }
    }
    if (res.empty())
    {
        cout << "NONE" << endl;
        return 0;
    }
    sort(res.begin(), res.end());
    N = res.size();
    for (int i = 0; i < N; i++)
    {
        cout << res[i].second << " " << res[i].first << endl;
    }
   return 0;
}
View Code

 

posted @ 2018-10-19 21:33  besti_kuroko  阅读(214)  评论(0编辑  收藏  举报