【題目描述】
簡單的題目,既是禮物,也是毒藥。
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 的做法 考慮列舉刪去哪一條邊,假如刪掉當前列舉的邊,那麼整棵樹會被分成兩個部分,然後我們要把這條邊重新找個位...