【LLM】Qwen3-30B-A3Bを評価|競プロ問題を解いてみる

最近はChatGPTやGeminiといったクラウドベースの大規模なLLMだけでなく、ローカルで実行可能な比較的小さなLLMでも数学やプログラミングの問題を解くことができるようになっています。この記事では、AtCoderの問題をQwen3-30B-A3Bに解かせてみました。
はじめに
AtCoderでもLLMのコンテスト中の使用が禁止されるくらいプログラミングの問題を解けるようになっています。また、ChatGPTやGeminiなどのクラウドベースの巨大なモデルだけでなく、ローカルで実行可能な比較的小規模のLLMの性能も向上しています。
そこで、私が最近使っているQwen3-30B-A3Bを使って「競プロ典型 90 問」の001問目を解いてみました。
Qwen3-30B-A3Bについて
Qwen3は中国のアリババが公開したオープンソースの大規模言語モデルです。Qwen3には0.6B, 1.7B, 4B, 8B, 14B, 32B, 30B-A3B, 235B-A22Bというモデルがありますが、今回は、MoEモデルの30B-A3Bを使います。
Qwen3は2025年5月に発表されたQwenの最新モデルで数理演算、コーディング、論理推論において高い成績を収めています。
また、推論モデルと非推論モデルをプロンプトに/no_think
, /think
と書くことで切り替えることが可能です。このため、数学やプログラミングなどの推論が必要な場合には推論モデルとして、普通の質問では非推論モデルとして使うことが可能です。
今回は、Qwen3-30B-A3Bの8bit量子化モデルを利用しました。
- MacBook Pro(M4Max, 128GB)
- qwen3-30b-a3b-mlx(8bit 32.46 GB)
- 実行環境:LMStudio
MacBookのメモリが128GBあるので、8bitの量子化版を使いました。8bitの量子化の場合パラメータのサイズは32.46GBです。
30B-A3BはMoEモデルで、アクティブになるのは3Bパラメータとなるので、賢い割に高速なのがポイントです。
実際、動かすと以下のような速度で返答します

80.99 tok/secとかなり速いことがわかります。これくらい高速であれば、推論モデルでもそれなりの速度の応答が期待できます。
「競プロ典型 90 問」を解く
001 – Yokan Party(★4)
典型問題の1問目は以下のような問題です
左右の長さが $L$ [cm] のようかんがあります。 NN 個の切れ目が付けられており、左から $i$ 番目の切れ目は左から $Ai$ [cm] の位置にあります。
あなたは$N$ 個の切れ目のうち$K$個を選び、ようかんを$K+1$個のピースに分割したいです。そこで、以下の値を スコア とします。
- $K+1$個のピースのうち、最も短いものの長さ(cm 単位)
スコアが最大となるように分割する場合に得られるスコアを求めてください。
最も短いものの最大値を求める問題で、この問題は二分探索で求めることが可能です。これをQwen3に解かせてみます。問題は、htmlをmarkdownに変換してQwenに渡しました。また、以下のようなシステムプロンプトを与えて計算量を考慮するように指示しています。
これから解いてもらう問題は、AtCoderの問題の1つです。
AtCoderの問題は以下のような特徴があります。
AtCoderの問題の特徴
- 演算量が問題になることが多い。例えば、N^2で解ける問題だがNで解かないと間に合わないなど
- 演算量が1e7程度なら愚直にやっても問題ない
- 問題には制約が与えられるのでそれを見て演算量を考え、適切な解放を選ぶ必要がある
- 二分探索、動的計画法、グラフなどをつかうことで解ける問題も多い
- 数学的な問題が出題されることもある
ここでは、以下の手順で解き、最終的にプログラムを作成してください。思考過程や解説は日本語で出力してください。
- 問題の理解:問題を読み、まとめた内容を書く
- 方針の整理:どのようなアプローチで解くかを書く
- 解法:解法とそれに沿ったプログラムを書く
なお以下の情報が与えられます。
与えられる情報
- 問題文:問題文です
- 制約:制約です
- 入力フォーマット
- 入力例と出力例:入力と出力例です
結果
結果として以下のような解答を出力しました。
問題の理解
与えられる長さLのようかんを、N個の切れ目の中からK個を選んで分割し、分割後のピースの中で最も短いものの長さ(スコア)を最大化する問題です。このスコアは、分割されたピースの最小値であり、これを最大化するためには賢い分割方法が必要です。
方針の整理
この問題は、スコアを最大化するための典型的な二分探索の応用問題です。具体的には、スコアの候補値を二分探索し、そのスコアが実現可能かどうかをチェックすることで解きます。
- 二分探索の範囲:スコアは0からL(ようかん全体の長さ)の間になります。
- チェック関数:あるスコア
mid
が実現可能かどうかを判定します。これは、以下の条件を満たすかで判断します:- K個の切れ目を選んで分割し、すべてのピースが
mid
以上である。
- K個の切れ目を選んで分割し、すべてのピースが
解法
- 二分探索でスコアの候補値を試す。
- チェック関数:
- 0からスタートし、K個の切れ目を選んで分割する。
- 分割後、最後のピースも
mid
以上であるかをチェックする。
- 二分探索で最大値を見つける。
import sys
def main():
N, L = map(int, sys.stdin.readline().split())
K = int(sys.stdin.readline())
A = list(map(int, sys.stdin.readline().split()))
def is_possible(mid):
count = 0
prev = 0
for a in A:
if a - prev >= mid:
count += 1
prev = a
if count == K:
break
return count == K and (L - prev) >= mid
low = 0
high = L
while low < high:
mid = (low + high + 1) // 2
if is_possible(mid):
low = mid
else:
high = mid - 1
print(low)
if __name__ == "__main__":
main()
解法は二分探索を選択しています。また、出力されたPythonプログラムも正解です。
ちなみに、推論時間は以下のようになりました。

また、出力速度は以下のようになりました。

コンテキストが増加しているので、57.77 tok/secとすこし遅くなっていますが十分な速度です。最大トークン数を40960に設定していたので、11832トークンということで範囲内に収まりました。
以下、推論の時間、出力が完了するまでの時間をまとめました。
推論時間 | 約3分11秒 |
出力完了 | 約3分25秒 |
推論完了後15秒ほどで出力が完了していることわかります。
感想など
最近、コンテストに参加しておらず、後日問題を解いています。この時、自力で解きつつAIにも同じ問題を解かせています。Qwen3は典型的な問題であれば、難し目な問題もサクッとといてしまう一方、簡単な問題でつまづくことが多い印象です。結局、パターン化されている典型問題は得意で、発想が必要な問題は不得意という感じでしょうか。
Qwen3で解けなかった場合に、ChatGPTのo1などで解かせてみたりしますが、やはりクラウドベースのモデルの方が少し賢い印象です。ただ、ローカルで32GB程度のパラメータのモデルでここまで解けるようになったのは驚きです。
まとめ
Qwen3-30B-A3Bを使って競技プログラミングの問題を解かせてみました。このモデルは3Bモデルの速度で動作するため非常に高速で、かなり賢いモデルだと感じました。ただ、少し難しい問題をサクッと解ける割には、簡単な問題でつまづいたりと、どうも典型から外れた問題が不得意みたいです。

東大生が難しい数学問題は解けるのに、小学生の図形問題に苦戦するみたいな感じです。パターン化された問題は得意なんでしょうね。
また、普通に会話する場合は、Gemma3-27Bの方が返答が良い気もします(ただし速度は15tok/sec程度)。
ローカルLLMもかなり使えるようになっています。そのうちスマホで動作するモデルもそこそこ使えるようになりそうです。