题意:给定一个数组A,求长度为k的A的子序列中等差数列的个数。模为998244353。如果两个子序列取自不同的位置,即使它们作为序列是相等的,也是有区别的。
分析:设dp[i][k][d]为以i为结尾公差为d的长度为k的个数。k的范围为[1,n]
当len为1时,d为0;当len为2时,d为两数之差
dp[i][k][ai-aj]=(dp[j][k-1][ai-aj](j的范围为[2,n-1]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100;
const ll mod=998244353;
ll a[N],ans[N];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
dp[i][1][0]=1;//长度为1为本身
ans[1]++;ans[1]%=mod;
for(int j=1;j<i;j++){//长度为2
dp[i][2][a[i]-a[j]]++;
}
ans[2]+=i-1;ans[2]%=mod;
}
for(int k=3;k<=n;k++){//枚举长度
for(int i=3;i<=n;i++){//i为结尾
for(int j=i-1;j>=1;j--){//i前面
dp[i][k][a[i]-a[j]]+=dp[j][k-1][a[i]-a[j]]%mod;
dp[i][k][a[i]-a[j]]%=mod;
ans[k]+=dp[j][k-1][a[i]-a[j]]%mod;
ans[k]%=mod;
}
}
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
return 0;
}