けれどもこのトピックは1600年ですが、まだ非常に考えて。
考えるのは少し難しいです。
それは、プレフィックスと認識し、関連の比較的高速起動する必要があります
X X + A1 X + A1 + A2のx + A1 + A2 + A3 ...
X +和= B
このXのM Bを満たすために見つけ、それはxが合理的であることを示しているのであれば、私たちは、それぞれのbのxを列挙することができます。
しかし、彼らはない虫をすれば、X = B-合計と同じの2を見つけることですので、デエンファシスのこの合計は、なぜ、それの重量に行くことに注意してください
限り理由毎bについて、前記決定された休止位置もBを固定した後、[1]〜Bを列挙することができるように。
書式#include <iostreamの> の#include <cstdioを> する#include <cstdlib> 書式#include <CStringの> の#include < 文字列 > の#include <キュー> の#include <アルゴリズム> 書式#include <マップ> 書式#include <iomanip> に#define INF 99999999 使用 名前空間はstd; const int型 MAXN = 2E6 + 10 。 typedefの長い 長いLL。 INT [MAXN]。 LL和[MAXN]。 マップ <LL、int型 > 融点; int型 { int型N、M。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 i = 1 ; iが<= N; iが++ ) { scanf関数(" %のLLDを"、&和[I])。 和[I] + =和[I - 1 ]。 MP [和[I] = 1 。 } のための(int型 I = 1 ; I <= M; iが++)のscanf(" %dの"、および[I])。 ソート(合計 + 1、合計+ 1+N); INT LEN =ユニーク(和+ 1、和+ 1個の + N) -和- 1 。 int型 ANS = 0 ; 以下のために(int型 i = 1 ; iは= LEN <; iは++ ) { int型の CNT = 0、NUM = [ 1 ] - 和[I]; 用(INTの J = 1 ; J <= Mであり、j ++ ) { 場合(MP [J] - NUM])CNT ++ 。 } 場合(CNT> = m)は++ ANS 。 } のprintf(" %Dを\ n " 、ANS)。 リターン 0 ; }