题目分析
给你一个X 和 Y
他们的 质因数分解之后的数组,即相应的 质数和幂次
要你求 GCD Q P = Y LCA Q P = Y (P Q 任取) 有多少个P Q 满足条件 对MOD 取余
方法
先看看样例和题目的条件
- 众所周知
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;
}