洛谷 4933 洛谷10月月赛II T2 大师
【题解】
f[i][j]表示最后一个数为h[i],公差为j的等差数列的个数。n方枚举最后一个数和倒数第二个数转移即可。注意公差可能为负数,需要移动为正数再作为下标。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define rg register 6 #define N 1010 7 #define Mod (998244353) 8 #define P (20000) 9 using namespace std; 10 int n,mx,ans,h[N],f[N][40010]; 11 inline int read(){ 12 int k=0,f=1; char c=getchar(); 13 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 14 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 15 return k*f; 16 } 17 inline void MOD(int &k){if(k>=Mod) k-=Mod;} 18 int main(){ 19 n=read(); 20 for(rg int i=1;i<=n;i++) h[i]=read(); 21 for(rg int i=1;i<=n;i++){ 22 ans++; 23 for(rg int j=i-1;j;j--){ 24 f[i][h[i]-h[j]+P]+=f[j][h[i]-h[j]+P]+1; MOD(f[i][h[i]-h[j]+P]); 25 ans+=f[j][h[i]-h[j]+P]+1; MOD(ans); 26 } 27 } 28 printf("%d\n",ans); 29 return 0; 30 }