专栏文章

题解:AT_abc392_g [ABC392G] Fine Triplets

AT_abc392_g题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miq901y9
此快照首次捕获于
2025/12/04 00:55
3 个月前
此快照最后确认于
2025/12/04 00:55
3 个月前
查看原文

[ABC392G] Fine Triplets

前言

赛后才知道有官方库。

正文

题意就是问有多少三元组 (i,j,k)(i,j,k) 满足 ajai=akaj(ai<aj<ak)a_j-a_i=a_k-a_j(a_i<a_j<a_k)
移位后得 ai+ak=2aja_i+a_k=2a_j,将 aia_i 看成 xaix^{a_i},因为 xixj=xi+jx^ix^j=x^{i+j},于是就可以直接用快速傅里叶变换(多项式乘法)做。2ai2a_i 次项的系数为 vv,那么 v12\frac{v-1}{2} 就是 B=aiB=a_i 时的方案数(因为 aiajaka_i\ge a_j\ge a_k 的情况要剪掉),加起来即可。
提示:FFT 卷积在官方库中有。

AC Code

CPP
#include <atcoder/convolution>
#include <bits/stdc++.h>
#define int long long
using namespace std;
using namespace atcoder;
int a[1000005];
vector <int> s , c , s2;
signed main ()
{
	ios::sync_with_stdio (0) , cin.tie (0) , cout.tie (0);
	int n;
	cin >> n;
	s.resize (1e6 + 5); 
	for (int i = 1;i <= n;i ++)
		cin >> a[i] , s[a[i]] = 1;
	s2 = s;
	c = convolution (s2 , s2);
	int ans = 0;
	for (int i = 1;i <= n;i ++)
		ans += (c[a[i] << 1] - 1) >> 1;
	cout << ans;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...