题目链接:https://www.luogu.com.cn/problem/P4933
方程的设计比较难想:
设f[i][j]表示等差数列的最后一个数的位置为i,公差为j的方案数。
转移的话:
枚举k从1到i,f[i][j]+=f[k][j]。
最后累加答案,注意ans+i的含义(一个及两个的方案数)。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int N=1005; 5 const int M=20000; 6 const int mod=998244353; 7 int n,ans; 8 int h[N],f[N][M<<1]; 9 int main(){ 10 scanf("%d",&n); 11 for(int i=1;i<=n;i++) scanf("%d",&h[i]); 12 for(int i=1;i<=n;i++){ 13 ans=(ans+i)%mod; 14 for(int j=1;j<i;j++){ 15 int now=h[i]-h[j]; 16 ans=(ans+f[j][now+M])%mod; 17 f[i][now+M]=(f[i][now+M]+f[j][now+M]+1)%mod; 18 } 19 } 20 printf("%d",ans); 21 return 0; 22 }