首页 > 其他分享 >abc252_d Distinct Trio 题解

abc252_d Distinct Trio 题解

时间:2023-04-29 23:57:03浏览次数:37  
标签:Trio frac ne Distinct 题解 cnt long times int

这是数学题耶!

题意

给定一个整数 \(n\) 和一个长度为 \(n\) 的整数序列 \(a\),求满足以下要求的三元组个数:

  • \(1 \leqslant i < j < k \leqslant n\)。
  • \(a_i \ne a_j\),\(a_j \ne a_k\),\(a_k \ne a_i\)。

思路

先想正着做,好,不会。

正着做不行就反着做,先算出所有情况,再去掉不合法。

  • 所有情况的公式:\(\frac{n \times (n-1) \times (n - 2)}{6}\)。
    • 公式小解析:首先不考虑顺序,选掉一个数就少一个,选 \(3\) 个就是 \(n \times (n - 1) \times (n - 2)\)。
    • 考虑顺序,去掉不合法,除以 \(6\)。
  • 不合法的公式:
    • 不合法的情况就两种:
      • 两个数相同,另一个不同。
      • 三个数都相同。
    • 令 \(cnt_i\) 表示 \(i\) 在序列中的出现次数。
    • 对于一个出现在序列中的整数 \(i\),它对答案的负贡献分为以下两种:
      • \(\frac{cnt_i \times (cnt_i - 1) \times (cnt_i - 2)}{6}\),三个元素都相同,与所有情况同理。
      • \(\frac{cnt_i \times (cnt_i - 1) \times (n - cnt_i)}{2}\),其中两个元素相同需要去重,除以 \(2\),另外一个数可以是非 \(i\) 的任意数。

记得开个 long long

Code

#include <iostream>

using namespace std;
using ll = long long;

const int N = 2e5 + 10;

int n, a[N], cnt[N];
bool f[N];
ll ans; // 记得开 long long

int main () {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    cnt[a[i]]++; // 统计出现次数
  }
  ans = 1ll * n * (n - 1) * (n - 2) / 6; // 所有情况
  for (int i = 1; i <= n; i++) {
    if (f[a[i]]) { // 同一个数不用多次求
      continue;
    }
    f[a[i]] = 1; // 标记
    ans -= 1ll * cnt[a[i]] * (cnt[a[i]] - 1) * (cnt[a[i]] - 2) / 6; // 套用公式
    ans -= 1ll * cnt[a[i]] * (cnt[a[i]] - 1) * (n - cnt[a[i]]) / 2;
  }
  cout << ans;
  return 0;
}

标签:Trio,frac,ne,Distinct,题解,cnt,long,times,int
From: https://www.cnblogs.com/lw0-blog/p/17364713.html

相关文章

  • ABC G Ex 简要题解
    ABC212GPowerPair推柿子题\(\sum\limits_{x}^{P-1}\sum\limits_{y}^{P-1}\existsn\in\mathbb{N}\x^n\equivy(\bmodP)\)\(1+\sum\limits_{x=1}^{P-1}\sum\limits_{y=1}^{P-1}\existsn\in\mathbb{N}\x^n\equivy(\bmodP)\)考虑模\(P\)......
  • AT_abs300_e 题解
    一、题目描述:你有一个骰子,数字1~6可以被等概率扔到。初始时有一个数$ans=1$。当扔到数字$x$时,$ans=ans\timesx$。给你一个数字$n$,求$ans$能等于$n$的概率。$n<=1e18$。答案对$998244353$取模。 二、解题思路:当扔到$1$时,相当于......
  • 皇后游戏 题解
    luoguP2123题目描述皇后有\(n\)位大臣,每位大臣的左右手上面分别写上了一个正整数。恰逢国庆节来临,皇后决定为\(n\)位大臣颁发奖金,其中第\(i\)位大臣所获得的奖金数目为第\(i-1\)位大臣所获得奖金数目与前\(i\)位大臣左手上的数的和的较大值再加上第\(i\)位大臣右手......
  • 题解
    D.RangeandPartition1800思维https://codeforces.com/contest/1631/problem/D题解:由于严格大于,故其最终前缀和s[n]>=k,而当s[n]>=k,s[0]=0,每步至多下降1,故其中必有至少k个点满足s[i]=x(1<=x<=k),故符合题意,故只需双指针找出最小的满足题意的区间即可。#include<bits/stdc++......
  • 4 月 27 日测试题解
    4月27日测试题解最短路专场T1\({\color{green}{\text{100pts}}}\text{/100pts}\)题意给出\(m\)个变量与\(n\)个约束,每个约束形如以下三种中的一种;\(x_i-x_j\lew\)\(x_i-x_j\gew\)\(x_i-x_j=w\)有\(q\)个询问,每个询问为形如\((x_i,x_j)\)的二元......
  • 4 月 21 日测试题解
    4月21日测试题解T1\({\color{green}{\text{100pts}}}\text{/100pts}\)题意给出平面上的两条线段,求线段之间的距离。\(\text{|线段端点坐标|}\le10^4\)。思路一开始想的是分讨,但是又怕自己写挂了,所以就写了三分套三分。至少这个不怕少讨论一个情况。既然是三分套三分,......
  • 问题解决:Component name "xxx" should always be multi-word vue/multi-word-compone
    如题,原因是单个单词命名时语法检测无法通过,可以在导出组件时通过name属性给组件名加一个后缀,比如Component。<script>exportdefault{//当组件名为一个单词时,语法检查是无法通过的,可以设置name的值为2个单词来规避检查。name:'HomeComponent'}<......
  • IdentityServer4 问题解决
    RedirectUris={"https://localhost:7098/signin-oidc"},PostLogoutRedirectUris={"https://localhost:7098/signout-callback-oidc"},服务端添加这个 RequirePkce=false,添加这一句......
  • open3d Reconstruction system 问题解决
    1.https://github.com/luckyluckydadada/Azure-Kinect-DK-3D-reconstruction 2.open3d版本:0.14.10.16.00.17.0会报错:open3d.cuda.pybind.piplines.odommetry.OdomtryOptionbojecthasnoattribute'max_depth_diff' 3.结果问题一:    根据......
  • [P4145 上帝造题的七分钟 2 / 花神游历各国]题解
    P4145上帝造题的七分钟2/花神游历各国题目描述分析一开始在思考有没有一个数学公式来处理每一个开方的操作但发现数据的\(\le10^{12}\)那么最多开六次就变成1了(突破口)这样每一个数的有用操作只有6次其他就全部是1很显然,我们可以去记录每一段是否全为1再用线段树、分......