大师 - 洛谷
的序列中等差数列的数量。
的数据:可以直接暴力枚举整个序列的每一个子序列,然后
判断。
。
的数据:可以设
表示以
为结尾公差为
的数列总数。然后枚举范围
内的公差。
。
的数据:考虑极大一部分的公差枚举都是浪费的,于是我们不如改为枚举
,根据两个数之间相减直接确定公差。
。
description:
求一个长度为

solution:


总时间复杂度


![f[i][j]](https://i-blog.csdnimg.cn/blog_migrate/870c22628546cc39da3960600aff8632.png)


![[-(max_a-min_a),max_a-min_a]](https://i-blog.csdnimg.cn/blog_migrate/24cfb137128a2e93edbd71b0d850691c.png)
总时间复杂度

#include<cstdio>
#include<algorithm>
using namespace std;
long long mod=998244353;
long long f[1005][50005],g[200005];//f[i][j]表示到i为止公差为j的方案数。
long long a[1005];
long long max(long long x,long long y)
{
if(x>y)return x;
return y;
}
long long min(long long x,long long y)
{
if(x<y)return x;
return y;
}
inline long long read() {
char ch = getchar(); long long x = 0, f = 1;
while(ch < '0' || ch > '9') {
if(ch == '-') f = -1;
ch = getchar();
} while('0' <= ch && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
} return x * f;
}
int main()
{
long long n;
long long tmp=20000;
scanf("%lld",&n);
long long Max=0,Min=1000000000;
for(long long i=1;i<=n;i++)
{
a[i]=read();
//scanf("%lld",&a[i]);
Max=max(Max,a[i]);
Min=min(Min,a[i]);
//f[i][0]=1;
}
//f[1]=1;
/*for(long long d=-20000;d<=20000;d++)
{
g[d+tmp]=1;
}*/
long long ans=0,qaq,qwq;
long long orz=Max-Min;
for(register long long d=-orz;d<=orz;d++)
{
for(register long long i=1;i<=n;i++)
{
g[a[i]+2*tmp]=0;
}
for(register long long i=1;i<=n;i++)
{
qaq=d+tmp;
qwq=a[i]+2*tmp;
f[i][qaq]=g[qwq-d];
f[i][qaq]%=mod;
g[qwq]+=f[i][qaq]+1;
g[qwq]%=mod;
ans+=f[i][qaq];
ans%=mod;
}
}
/*long long ans=0;
for(long long d=-20000;d<=20000;d++)
{
ans+=f[d];
ans=ans%mod;
}*/
printf("%lld\n",(ans+n)%mod);
return 0;
}


总时间复杂度

#include<cstdio>
#include<algorithm>
using namespace std;
long long mod=998244353;
int a[1005];
long long f[1005][50005];
int main()
{
int n;
scanf("%d",&n);
int maxa=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxa=max(maxa,a[i]);
}
long long ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
int tmp=a[i]-a[j]+maxa;
long long p=f[j][tmp]+1;
f[i][tmp]=(f[i][tmp]+p)%mod;
ans=(ans+p)%mod;
}
}
printf("%lld\n",(ans+n)%mod);
return 0;
}