題解 CTSC2017 吉夫特

2022-04-01 06:02:28 字數 2865 閱讀 2887

【題目描述】

簡單的題目,既是禮物,也是毒藥。

b 君設計了一道簡單的題目,準備作為 gift 送給大家。

輸入乙個長度為 \(n\) 的數列 \(a_1, a_2 , \dots, a_n\) 問有多少個長度大於等於 \(2\) 的不上公升的子串行 \(a_, a_, \ldots, a_\) 滿足

\[\prod\limits_ ^ k \binom}}} \bmod 2 = \binom}} \times \binom}} \times \cdots \times \binom}}}\bmod 2 > 0

\]輸出這個個數對 \(1000000007\) 取模的結果。

g 君看到題目後,為大家解釋了一些基本概念。

我們選擇任意多個整數 \(b_i\) 滿足

\[1 \leq b_1 < b_2 < \cdots < b_ < b_k \leq n

\]我們稱 \(a_, a_, \ldots, a_\) 是 \(a\) 的乙個子串行。

如果這個子串行同時還滿足

\[a_ \geq a_ \geq \ldots \geq a_

\]我們稱這個子串行是不上公升的。

組合數 \(\binom\) 是從 \(n\) 個互不相同的元素中取 \(m\) 個元素的方案數,具體計算方法如下:

\[\binom = \frac = \frac

\]這裡要特別注意,因為我們只考慮不上公升子串行,所以在求組合數的過程中,一定滿足 \(n \geq m\),也就是 \(\binom}}}\) 中一定有 \(a_} \geq a_\)。

我們在這裡強調取模 \(x \bmod y\) 的定義:

\[x \bmod y = x - \lfloor \frac \rfloor \times y

\]其中 \(\lfloor n \rfloor\) 表示小於等於 \(n\) 的最大整數。

\(x \bmod 2 > 0\),就是在說 \(x\) 是奇數。

與此同時,經驗告訴我們乙個長度為 \(n\) 的序列,子串行個數有 \(o(2 ^ n)\) 個,所以我們通過對答案取模來避免輸出過大。

b 君覺得 g 君說的十分有道理,於是再次強調了這些基本概念。

最後,g 君聽說這個題是作為 gift 送給大家,她有一句忠告。

「vorsicht, gift!」

「小心. . . . . . 劇毒!」

【輸入格式】

第一行乙個整數 \(n\)。

接下來 \(n\) 行,每行乙個整數,這 \(n\) 行中的第 \(i\) 行,表示 \(a_i\)。

【輸出格式】

一行乙個整數表示答案。

【樣例輸入】

4157

31

【樣例輸出】
11
【資料範圍與提示】

對於前 \(10\%\) 的測試點,\(n \leq 9, 1 \leq a_i \leq 13\);

對於前 \(20\%\) 的測試點,\(n \leq 17, 1 \leq a_i \leq 20\);

對於前 \(40\%\) 的測試點,\(n \leq 1911, 1 \leq a_i \leq 4000\);

對於前 \(70\%\) 的測試點,\(n \leq 2017\);

對於前 \(85\%\) 的測試點,\(n \leq 100084\);

對於 \(100\%\) 的測試點,\(1 \leq n \leq 211985, 1 \leq a_i \leq 233333\)。

所有的 \(a_i\) 互不相同,也就是說不存在 \(i, j\) 同時滿足 \(1 \leq i < j \leq n\) 和 \(a_i = a_j\)。

做這題的前置知識是 lucas 定理,可以先做一下這題。

我就當大家都會 lucas 定理了awa。

lucas 定理:

\[c^m_n\!\equiv\!c^\right\rfloor}_\right\rfloor}\times c^_\pmod

\]所以我們來看看原式:

\[\prod_^k \dbinom}}}\!\mod 2

\]重點就在於 \(\!\mod 2\) 這個地方。

由 lucas 定理可知,原式的答案不是 0,就是 1。

所以我們要保證 \(\forall \dbinom}}} \equiv 1 \pmod 2\)。

又因為 \(\dbinom\),\(\dbinom\),\(\dbinom\) 為 1,\(\dbinom\) 為 0。

根據 lucas 定理,每次 \(\mod 2\) 相當於把 \(a_\) 和 \(a_}\) 二進位制拆分,並且保證,\(a_\) 為 0 的那個位上 \(a_}\) 不能為 1。

即 \(a_}\!\and a_}\!=\!a_\),我們設 \(f(i)\) 為以 \(i\) 開頭的子串行數,列舉子集進行 dp 即可。

\(p.s.\) 在最後累加的時候,要減去只有乙個數的情況。

**如下:

#include#define rint register int

using namespace std;

inline int read()

while(c>='0'&&c<='9')s=(s<<1)+(s<<3)+c-48,c=getchar();

return f?s:-s;

}const int mod=1e9+7;

int n,a[300010],f[300010],ans;

int main()

for(rint i=1;i<=n;++i) ans=(ans+f[a[i]]-1)%mod;

printf("%d",ans%mod);

return 0;

}

沒了awa。

2017校賽題解

又是一年一度的校賽,三個人從出題到準備環境花了好幾天的時間。雖然也是蠻累的,期間出了一些小差錯,但總的來說還是蠻成功的 感覺比去年好一些,逃。一共出了7題,但是考慮到比賽時間比較緊張就砍掉了兩題 反正沒砍我的題,對了,關於 teddywang 同學在題面上黑我的情況表示強烈譴責,將在他不注意的時候實...

題解 AH2017 HNOI2017 禮物

problem 設旋轉好後我們加的值是 c.sum n a i b i c 2 sum a i 2 b i 2 c 2 2a ib i 2a ic 2b ic 這個式子除了 sum 2a ib i 都是定值。考慮求這個東西的最大值。把 2 扔了,原式 sum a ib i 反轉 a 得到 sum a...

TJOI 2017 城市 題解

題目傳送門 題目大意 給一棵邊帶權的樹,你可以將一條邊換個位置,換完之後還得是一棵樹,要求換完之後樹的直徑最小。o n o n o n 做法太強了,只能想到 o n 2 o n 2 o n2 的做法 考慮列舉刪去哪一條邊,假如刪掉當前列舉的邊,那麼整棵樹會被分成兩個部分,然後我們要把這條邊重新找個位...