數列運算 題解

2022-06-26 08:21:13 字數 1025 閱讀 5429

題目描述

在紙上有乙個長為n的數列,第i項值為ai。

現在小a想要在這些數之間新增加號或乘號。問對於不同的 種方案,

所有答案的和是多少?

由於資料範圍較大,所以輸出對1000000007取模的結果。

輸入格式

輸入第一行乙個整數n表示數列的長度。

之後一行n個整數,第n個整數表示數列的第i項ai。

輸出格式

一行,答案對1000000007取模的結果。

樣例輸入

31 2 4

樣例輸出

資料範圍與提示

對於30%的資料,1≤n≤10,1≤ai≤10^5

對於另外30%的資料,1≤n≤1000,ai=1

對於90%的資料,1≤n≤1000,1≤ai≤10^5

對於100%的資料,1≤100000,1≤ai≤10^9

題目大意:如果有 n 個數,新增乘號或加號總共有 \(2^\) 種方案,要求對其求和。

首先想到暴搜,但是好像又不太好寫,因為有加號有乘號的時候會先計算乘法,需要考慮的比較多,我是直接 pass 了。

那就考慮遞推唄。因為加法乘法混合的時候有優先順序的問題,所以可以考慮如何巧妙的避開這個問題。我們可以考慮最後乙個加號的位置,再之後所有的數之間都是做乘法,這樣前後兩部分相加就行了。順著這個思想繼續的話, 我們得考慮最後乙個加號的位置,有 n 個數就會有 n-1 個位置,可以列舉一下。

設 f[i] 表示 i 個數的總和,那麼針對最後乙個加號的位置,設最後乙個加號在第 j 個數之後,那麼有:

\(f[i] = \sum_^(f[j]+a_\times a_\times\dots\times a_i\times 2^) + \prod_^i a_k\)。

我們一項一項來分析:

我們把上面的式子展開一下:

\(f[i] = \sum_^f[j] + \sum_^ (a_\times a_\times\dots\times a_i\times 2^) + \prod_^i a_k\)。

下面我們又可以顯然了:

審美課 位運算 題解

一開始傻傻的超原始暴力,只拿了70分 後來參考了別人的思路用位運算解出來了 思路 兩個二進位制數若完全相反,異或結果為全一,如10010和01101異或結果是11111 將二進位制轉化為十進位制 用乙個陣列記錄下每個數出現的次數 只需要遍歷每個數a,將其與全1異或,得到的結果b的個數就是與a完全相反...

THUSC2015 解密運算 題解

source 拿幾個小資料玩一玩,如bca ac acc 可以多找幾個 先看所有字母均不相同的情況,我們發現乙個小規律 設加密串中 的位置為 m m m 則將加密串按字典序排序後第 m m m 位的字母即為解密串第 1 1 1 個字母 再想想能不能將這個規律拓展到有字母相同的情況,很容易想到將位置作...

位運算題目

今天看到牛客網的一些題目,非常經典。解法基本也都很熟悉,所以特地做個總結,後續慢慢補充。先上題目 數字中的二進位制有多少個1 這裡的數字並不關心它的符號,所以即便是負數,只需要得到二進位制中1的個數就可以了。但是在python中,對於負數的右移運算,符號位會保留,這樣在執行迴圈語句的右移操作時,首位...