题意:
给你一个由m限制下的集合,在这个集合中找出所有长度为n的等差数列。
思路:
暴力+优化。
首先可以枚举公差d,d的最大值取
m
∗
m
∗
2
/
(
n
−
1
)
+
1
m*m*2/(n-1)+1
m∗m∗2/(n−1)+1即可,然后以公差d枚举数列的最后一位,判断该位是不是该数列的第n个数。
#include<iostream>
#include<string>
#include<map>
#include<iomanip>
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
#define endl '\n'
using namespace std;
const double eps = 0.0000001;
int v[10001000];
int vis[10000100];
int main()
{
int n;
cin>>n;
int m;
cin>>m;
int num = 0;
for(int i = 0; i <= m; i++)
{
for(int j = 0; j <= m; j++)
{
vis[i*i+j*j] = 1;
int k = i*i+j*j;
}
}
int cnt = 0;
for(int d = 1; d <= m*m*2/(n-1)+1; d++)
{
for(int i = 0; i <= m*m*2; i++)
{
if(vis[i])
{
if(i-d>=0)v[i] = min(v[i-d]+1,n);
else v[i] = 1;
}
if(v[i] == n)
printf("%d %d\n",i-(v[i]-1)*d,d),cnt++;
}
for(int i = 1; i <= m*m*2; i++)v[i] = 0;
}
if(!cnt)cout<<"NONE\n";
}