[BZOJ 5074]小B的数字

Description

题库链接

给你一个长度为 (n) 的序列 (a_1,a_2,cdots,a_n) ,让你生成另一个序列 (b_1,b_2,cdots,b_n) ,使得 (forall iin [1,n],b_i=2^{k},kinmathbb{Z^*}) 并且对于 (forall iin [1,n],prodlimits_{j=1}^n b_j{largemid} b_i^{a_i})(T) 组询问,询问能否构造出这样的 (b)

(1leq nleq 10^5,a_ileq 10, Tleq 10)

Solution

考虑让 (b_i=2^{c_i},c_iin mathbb{Z^*}) ,那么题设的条件就变为 (forall iin [1,n],2^{sumlimits_{j=1}^nc_j}{largemid} 2^{c_i imes a_i})

[egin{equation}forall iin [1,n],sumlimits_{j=1}^nc_jleq c_i imes a_iend{equation}]

容易发现将 (c_i) 整体扩大某个整数倍上述式子依旧成立。

对于 ((1)) 式,变形为 (forall iin [1,n],frac{sumlimits_{j=1}^nc_j}{a_i}leq c_i)

那么

[egin{aligned}sum_{i=1}^nfrac{sumlimits_{j=1}^nc_j}{a_i}&leq sum_{i=1}^nc_i\sum_{i=1}^nfrac{1}{a_i}&leq 1end{aligned}]

我们只要证明上述不等式是 ((1)) 式的充要条件即可。

对于必要性,比较显然,因为 ((1)) 式成立的话,上述式子一定成立。

证明充分性,假设上式不成立,那么 ((1)) 式一定不成立;假设上式子成立,我们考虑令 (c_i=frac{1}{a_i}) 那么两个式子就是相同的。

由上述结论,我们可以构造这样的一组 (b_i=2^{c_i})(c_i=frac{1}{a_i})

由之前的结论:将 (c_i) 整体扩大某个整数倍式子依旧成立。不妨让 (c_i) 乘上 ( ext{lcm}_{i=1}^n a_i) 那么得到解了。

所以判断存在性,只需判断是否满足 (sumlimits_{i=1}^nfrac{1}{a_i}leq 1)

Code

#include <bits/stdc++.h>
using namespace std;
const int fac = 3628800;

void work() {
    int n, x; long long s = 0; scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &x), s += fac/x;
    puts(s <= fac ? "YES" : "NO");
}
int main() {int t; cin >> t; while (t--) work(); return 0; }
原文地址:https://www.cnblogs.com/NaVi-Awson/p/8982278.html