在USACO算术级数任务上,我的代码在输入中超时:
12
50
这是问题说明: 算术级数是形式为a,a + b,a + 2b,...,a + nb的序列,其中n = 0、1、2、3,...。对于这个问题,a是一个非负整数,b是一个正整数。
编写一个程序,在双平方集S中找到所有长度为n的算术级数。双平方的集合定义为形式为p2 + q2的所有整数的集合(其中p和q为非负整数)。
输入格式 第1行:N(3 <= N <= 25),要搜索的级数长度 第2行:M(1 <= M <= 250),将搜索范围限制为0 <= p,q <= M的双平方的上限。
如果未找到序列,则单行显示“ NONE”。否则,输出一行或多行,每行包含两个整数:找到的序列中的第一个元素和同一序列中连续元素之间的差。这些行应按最小差异顺序排列,并在这些顺序中以最小的起始编号排序。
我已经尝试过初步测试“开始”,看看它本身是否是一个双向正方形(您可以在我的代码中看到),,但是它没有足够的效果,并且已经阅读过有关同一问题的其他文章,并且没有帮助。 我的代码在下面。有人可以帮助我找到一种方法来使我的代码在< strong> 5秒时间限制?
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
vector<pair<int, int>> finals;
bool comp(pair<int, int> i, pair<int, int> j)
{
return (i.second < j.second);
}
bool is_prog(vector<int> prog, vector<int> bi_squares)
{
for (int i = 0; i < prog.size(); i++)
{
if (bi_squares[prog[i]] != 1)
{
if (prog[i] == 0)
continue;
return false;
}
}
return true;
}
int main()
{
ofstream fout("ariprog.out");
ifstream fin("ariprog.in");
vector<int> bi_squares;
bi_squares.resize(125001);
int n, m;
cin >> n;
cin >> m;
for (int i = 0; i <= m; i++)
{
for (int j = 0; j <= m; j++)
{
if (!binary_search(bi_squares.begin(), bi_squares.end(), (i*i) + (j*j)))
bi_squares[(i*i) + (j*j)] = 1;
}
}
for (int start = 0; start <= m * m; start++)
{
if (start == 0 || bi_squares[start] == 1)
{
for (int skip = 1; skip <= m * m; skip++)
{
vector<int> prog;
prog.push_back(start);
int cnt = 1;
int curr = start;
while (cnt < n)
{
curr += skip;
prog.push_back(curr);
cnt++;
}
if (is_prog(prog, bi_squares))
{
finals.push_back(make_pair(start, skip));
}
prog.clear();
}
}
else
continue;
}
sort(finals.begin(), finals.end(), comp);
if (finals.empty())
{
cout << "NONE" << "\n";
return 0;
}
for (auto x : finals)
cout << x.first << " " << x.second << "\n";
return 0;
}