明らかに我々は唯一に等しい$ N / 2 $ A未満の素数を考えます
各$ 2 $の場合、それは現在のマッチの偶数の倍数を持っていない場合は、明らかにこれらの仕上げを一致させることができ、素数$ pが$ではありません
奇数がある場合はそれ以外の場合は、その後、我々は持ち込ますべてのマッチの偶数個を残して、$ 2P $のミスマッチを保ちます
最後に残った数が、残りの奇数番号が一致することはできません滞在する場合にのみ、1は、一致させることができ、$ 2 $の倍数であります
明らかにこれは一致の数の上限です
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> の#include <ベクトル> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - '1 ; CH = GETCHAR()。} 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 1E5 + 7 。 int型のn; BOOL VIS [N]。 ベクトル <ペア< int型、int型 >> V; インラインボイドイン(int型のx、int型の Y){VIS [X] = VIS [Y] = 1; V.push_back(make_pair(X、Y))。} INT PRI [N]、TOT。 BOOL not_pri [N]。 ボイドプレ() { not_priは、[ 1 ] = 1 。 以下のために(int型 I = 2 ; iが<= N; iは++ ) { もし PRI [++ TOT =(not_pri [I]!)I。 用(INT J = 1 ; J <= TOTあり、j ++ ) { LL G = 1LL * iがPRI [j]を*。場合(G> N)、ブレーク。 not_pri [G] = 1。もし(I%PRI [J] ==0)ブレーク。 } } } int型のmain() { N = )(読み取ります。プレ()。 ベクトル < int型 > REM。// rem.push_back(2)。 以下のために(int型 I = 2 ; I <= TOT && PRI [i]の<= N / 2 ; I ++ ) { ベクトル < INT > TMP。INT T = PRI [i]は、 以下のための(int型 J = T; J <= N; J + = t)であれば(!VIS [J])tmp.push_back(J)。 int型 SZ =tmp.size(); もし(SZ&1 ) { イン(TMP [ 0 ]、TMP [ 2 ])。rem.push_back(TMP [ 1 ])。VIS [TMP [ 1 ] = 1 。 用(INT J = 3、J <SZ、J + = 2)イン(TMP [J]、TMP [J + 1 ])。 } ほか のため(int型 J = 0 ; J <SZ、J + = 2)イン(TMP [J]、TMP [J + 1 ])。 } のために(int型 I = 2 ; iが<= N; I + =2)もし!(VIS [i])とrem.push_back(I); INT SZ = rem.size()。 以下のために(int型 I = 1 ; I <SZ、I + = 2)イン(REM [I]、REM [I- 1 ])。 printf(" %d個の\ n "、INT (V.size()))。 以下のための(自動A:V)のprintf(" %D%D \ n " 、A.first、A.second)。 リターン 0 ; }