Hello! 欢迎来到Yearcode!

CF 1866B


avatar
lht006128 2025-06-19 11

题目分析

给你一个X 和 Y
他们的 质因数分解之后的数组,即相应的 质数和幂次
要你求 GCD Q P = Y LCA Q P = Y (P Q 任取) 有多少个P Q 满足条件 对MOD 取余

方法

先看看样例和题目的条件

  1. 众所周知
    LCA P,Q = P*Q / GCD P Q;
    又因为 GCD P Q = Y;
    所以 Q * P = X *Y
    又因为 GCD Q P = Y ,也就是说他俩都含有 Y 的质数以及对应的幂次。
    所以 X 必须要有Y 有的质数和 对应的幂次 (可以更大更多),这样才能保证 P Q 都有 Y
    反之答案为 0 ;

知道这个之后 你们观察样例1可能会不小心想到:
样例一 X 比Y 多了 两个个2 一个 5 7
你可能会觉得就是对于一个P 来说 可以选2 的情况有三种 3 * 2 * 2 答案不对

为什么不对 因为 如果你 比如 2 Q 选了一个 P 选了一个 那么他们的GCD 就变了 因为 各自多了一个2 .

所以对于P 或者Q 他们只能选一个数 或者不选。
最终答案就是 2^ K K 可选择的数的种类数。

AC 代码:

    #include <bits/stdc++.h>
#define int long long
using namespace std;

int mod = 998244353;

int a[200010];
int b[200010];
int c[200010];
int d[200010];

signed main()
{
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  map<int, int> mp;
  map<int, int> pos;
  int n;
  cin >> n;

  for (int i = 1; i <= n; i++)
  {
    cin >> a[i];
  }

  for (int i = 1; i <= n; i++)
  {
    cin >> b[i];
    mp[a[i]] = b[i];
  }

  int m;
  cin >> m;

  for (int i = 1; i <= m; i++)
  {
    cin >> c[i];
    pos[c[i]] = i;
  }
  int f = 0;
  for (int i = 1; i <= m; i++)
  {
    cin >> d[i];
    if (mp[c[i]] < d[i])
      f = 1;
  }

  if (f)
  {
    cout << 0;
    return 0;
  }

  int ans = 1;

  for (int i = 1; i <= n; i++)
  {
    if (pos[a[i]] == 0)
    {
      ans = ans * 2 % mod;
    }
    else
    {
      if (b[i] - d[pos[a[i]]] > 0)
      {
        ans = ans * 2 % mod;
      }
      // cout << d[pos[a[i]]] << " ";
    }
    // cout << ans << endl;
  }
  cout << ans;
}

暂无评论

发表评论
Yearcode Blog