G1. Magic Triples (Easy Version)(ranting 1700)超详细题解

G1. Magic Triples (Easy Version)(ranting 1700)超详细题解


前言

本系列的意义在于两点,一则是作为本人(一个编程初学者)的学习笔记记录,二则希望能对后来者提供一些帮助,因为本人也为新手,难免有些错误或讲述不清之处,恳请大家指出或提出建议,本人也会虚心修改。

本系列的目标是帮助大家解决一些codeforces上,ranting1600+(或者之后会改为1300+,看博主水平吧)的题目


一、题目及翻译

1. 原题(贴图)

Alt
【戳我跳转到题目】

2. 翻译
  1. 机翻版
    Alt
  2. 省流版
    对于一个整数序列,求满足下列条件的三元组的个数( (i , j, k) ),
    ①1 ⩽ \leqslant i,j,k ⩽ \leqslant n
    ②i ≠ \not= =j ≠ \not= =k
    ③存在一个正整数b使得 a i a_i ai × \times × b = a j a_j aj, a j a_j aj × \times × b= a k a_k ak
    注意:i,j,k之间没有顺序限制

二、解析及AC代码

1.解析

本题的时间限制比较宽泛,就给了我们暴力的空间(果然暴力才是王道.jpg)

我们的答案分为两部分:
1.首先我们需要计算b=1的情况,即 a i a_i ai= a j a_j aj= a k a_k ak。那么我们只需要记录每个 a i a_i ai出现的次数(设为cnt[ a i a_i ai]),那么此部分即为 c 3 c n t [ a i ] c{3 \atop cnt[ai] } ccnt[ai]3 * c 2 3 c{2 \atop 3} c32
2.然后我们暴力历遍b>1的情况,如果有cnt[ a i a_i ai] * cnt[ a i a_i ai * b] * cnt[ a i a_i ai * b * b]存在(其中2 ⩽ \leqslant b且 a i a_i ai × \times × b × \times × b <= N),那么就加入答案里

那么,此时同学们就可以自己去尝试一下了,如果还是有问题,可以参考下博主下面的AC代码

2.AC代码
#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 1e6 + 10, MAXI = 0x3f3f3f3f;

int n;
int a[N], cnt[N];
bool st[N];

int main()
{
  int t;
  cin >> t;
  for (int i = 0; i < t; i++)
  {
      cin >> n;
      memset(st, 0, sizeof st);
      memset(cnt, 0, sizeof cnt);
      for (int j = 0; j < n; j++)
      {
          cin >> a[j];
          cnt[a[j]]++;
      }
      LL ans = 0;
      for (int j = 0; j < n; j++)
      {
          if (!st[a[j]])
          {
              st[a[j]] = true;
              ans += (LL)cnt[a[j]] * (cnt[a[j]] - 1) * (cnt[a[j]] - 2);//C(3,n)*C(2,3)
              for (int b = 2; a[j] * b * b <= N; b++)
              {
                  ans += (LL)cnt[a[j]] * cnt[a[j] * b] * cnt[a[j] * b * b];
              }
          }
      }
      cout << ans << endl << endl;
  }
  return 0;
}

如果觉得有用还请点个赞吧,拜托拜托

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值