//https://codeforces.com/problemset/problem/1647/D
#include<bits/stdc++.h>
#include<unordered_map>
#include<array>
#define ll long long
#define ull unsigned long long
#define all(a) a.begin(),a.end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const ll mod = 998244353;
const int N = 1e5 + 5;
/*
定义一个数是d的倍数,不是d*d的倍数, 则为完美数
问x是否可以表示为一些完美数的乘积,且方案数大于等于二
*/
ll x, d, id[N], gid[N];
ll f[N];
vector<ll> fac, bea;
void solve()
{
cin >> x >> d;
fac.clear();
bea.clear();
for (ll i = 1; i * i <= x; i++)
{
if (x % i == 0)
{
fac.push_back(i);
if (x / i != i)
fac.push_back(x / i);
}
}
sort(all(fac));
for (int it : fac)//完美数
if (it % d == 0 && it / d % d)
bea.push_back(it);
for (int i = 0; i < fac.size(); i++)//离散化, 分成一大一小两个数组, 因为正常离散化或者map复杂度高
{
if (fac[i] < N)
id[fac[i]] = i;
else
gid[x / fac[i]] = i;
}
for (int i = 0; i < fac.size(); i++)
f[i] = 0;
f[0] = 1;
for (int i : bea)
{
for (int j : fac)//完全背包
{
if (x / i % j == 0)//i * j 是x的因子
{
int temp = i * j;
int idx1 = (temp < N ? id[temp] : gid[x / temp]);//离散
int idx2 = (j < N ? id[j] : gid[x / j]);
f[idx1] = f[idx1] + f[idx2];
}
}
}
int idx = (x < N ? id[x] : gid[1]);
cout << (f[idx] >= 2 ? "YES" : "NO") << '\n';
}
signed main()
{
IOS;
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}
D. Madoka and the Best School in Russia(因子背包, 完全背包, 大数值不带log的离散化)
最新推荐文章于 2024-09-15 16:37:51 发布