题目
思路
题目的n只给到了1000,数据量不大,我们可以如此操作,创建一个二维数组,arr[i][j]的含义是以i元素为结尾,公差为j的排序种类,在处理第i个元素时,我们遍历前i-1个元素,寻找i元素与其之差对应的序列种数并加1,就能得到以i元素为结尾,公差为此值的序列的种数,最后累加各个值,就能得到答案
AC代码
#include <iostream>
using namespace std;
int arr[1001][40005]={0};
int s[1001]={0};
int main()
{
int n=0;scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",s+i);
}
int res=n;
for(int i=2;i<=n;i++)
{
for(int ii=1;ii<i;ii++)
{
int tem=s[i]-s[ii]+20000;
arr[i][tem]+=arr[ii][tem]+1;
arr[i][tem]%=998244353;
}
}
for(int i=2;i<=n;i++)
{
for(int ii=0;ii<40005;ii++)
{
res+=arr[i][ii];
res%=998244353;
}
}
printf("%d",res);
return 0;
}