SRM697D1Easy DivisibleSetDiv1
ゴリ押しで通したけど想定解難しい
問題概要(原文)
$N$ 要素の数列 $B \; (\; 1 \leq B_i \leq 10)$ が与えられる.以下の制約を満たす数列 $A$ はあるか?
- $A_i > 1$
- $A_i$ は互いに相異なる
- $A_{i}^{B_{i}}$ は $\prod_{x \in A \; \setminus \; \{ A_{i} \} }x$ を満たす
考察
$B$ は昇順としても一般性は失わない.さらにこの問題は以下の制約を満たす数列 $C$ があるか判定せよと言い換えてもよい.
- $C_i \geq 1$
- $C_i$ は互いに相異なる
- $C_{i}(B_{i}+1) \geq \sum_{j = 0}^{N - 1} C_{j}$
これはどういうことかというと, $A_{i} = p_{0}^{q_{0}} p_{1}^{q_{1}} \ldots p_{m}^{q_{m}}$ とする. まず $A_i$ が $2$ のべき についてのみ考えてよいことを示す.
$A_{i}$ が ある素数 $p$ の冪乗で表される数でなくてはならない,という制約を加えたときに,条件を満たすもの数列 $A=\{ a_{0}, a_{1}, \ldots , a_{N - 1} \}$があったとする.ここで $a_{i} = p^{C_{i}}$ で表されるとする. もともとの問題と,先ほど述べた問題の答えが一致しなくてはならない.
さらに,素数 $p$ ごとに問題を分解することができるので,適当な素数 $p$ についてのみ考えればよくなる.
さて,条件を満たす数列 $C$ が存在するか判定したい気持ちになった. $\sum_{j = 0}^{N-1} C_{j} = X$ とおこう.
$C_{i} = \left \lceil \frac{X}{B_{i} + 1} \right \rceil$ としたときに, $X \geq \sum_{ j = 0 }^{N - 1} C_{j}$ となれば,条件を満たす.
$X$ を適当な数まで全探索すればよい.
ソースコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Debug = System.Diagnostics.Debug;
using StringBuilder = System.Text.StringBuilder;
public class DivisibleSetDiv1
{
public string isPossible(int[] b)
{
var n = b.Length;
Array.Sort(b);
for (int i = n; i <= 114514; i++)
{
var s = new HashSet<int>();
var sum = 0;
foreach (var x in b)
{
var k = (i + x) / (x + 1);
while (!s.Add(k)) k++;
sum += k;
if (sum > i) break;
}
if (sum <= i)
{
Debug.WriteLine(i);
return "Possible";
}
}
return "Impossible";
}
}
コメント
- これは結構好き