題目詳情
本題同樣來自caopengcs,只要你有興趣,每個人都可以出題(出題入口在主頁右側邊欄「貢獻題目」->「我要發布」內),以下是題目詳情:
子串行的定義:對於乙個序列a=a[1],a[2],......a[n],則非空序列a'=a[p1],a[p2]......a[pm]為a的乙個子串行,其中1<=p1例如:4,14,2,3和14,1,2,3都為4,13,14,1,2,3的子串行。
對於給出序列a,有些子串行可能是相同的,這裡只算做1個,要求輸出a的不同子串行的數量。
輸入: 長度為n的陣列1<=n<=100,陣列元素0<=a[i]<=110
輸出:子串行 的個數對1000000007取餘數的結果(由於答案比較大,輸出mod 1000000007的結果即可)。
函式頭部:
c/c++:
int run(cons int *a,int n);
其實我一開始就做對了,但是由於數目太大,超過了double能表示的精度,所以最後結果一直沒有對。現在幾經曲折,找到一種辦法。來解決數目太大的問題。
先說演算法的思想,
從左到右新增子串行,第一次取最左邊的乙個,第二次,加入第二個,第三次加入第三個『』『』『』『』加很簡單,主要是要去除相同的元素。
我用乙個陣列來記錄加入乙個數後當前序列個數增加的數目。既這些數目是由於加了這個數才產生的。
假設當前新增到第i個數,前面有n個不相同的子串行,那麼新加了這個數後,子串行的長度會增加一倍再加1,但是其中包含了很多重複的序列,重複的序列是因為前面存在相同的數字,只要用前面子串行的長度減去這些重複的數目,得到的就是這個新新增的數產生的新的子串行數目,記做in。假設前面只要第k個數和這個i上面的數相等,那麼in = n +1 - kn;如果前面還有其它相等的數,同樣要減去那個位置記錄的數。最後子串行的總數目等於 i1 + i2 + *+ in;
這樣思想是對的,但是要實現還差一點,因為最後的子串行數目非常大,用int不能表示,用long long也不能表示。
用double型別是能夠有這個範圍,但是失去了精度,不能儲存個位十位百位這些低位的數。我想到可以將結果分開來存,到結果大於乙個數後,就將大於的部分另外儲存。但是這樣運算速度太慢,失敗!後來我發現其實只需要儲存小於1000000007的部分就可以了,因為大於的部分最後求餘的時候都是沒有用的,而且運算中只要加減運算,於是結果如下:
int run(const
int *a,int n) }}
inum += iarry[i];
if (inum > 1000000007)
}return inum;}
龐果英雄會 子串行的個數
本題同樣來自caopengcs,只要你有興趣,每個人都可以出題 出題入口在主頁右側邊欄 貢獻題目 我要發布 內 以下是題目詳情 要求輸出a的不同子串行的數量。輸入 輸出 剛開始的時候我總想著直接去算排列組合,然後根據容斥原理把重複的去掉,從而得到結果,後來發現這樣不是不行,要考慮的東西實在是太多了,...
龐果英雄會 陣列排序
陣列排序 本題來自caopengcs,只要你有興趣,每個人都可以出題 出題入口在主頁右側邊欄 貢獻題目 內 以下是題目詳情 給定乙個包含1 n的數列,我們通過交換任意兩個元素給數列重新排序。求最少需要多少次交換,能把陣列排成按1 n遞增的順序,其中,陣列長度不超過100。例如 原陣列是3,2,1,我...
龐果英雄會 覆蓋數字
龐果覆蓋數字原題如下 給定整數區間 a,b 和整數區間 x,y 你可以使用任意多次a,b之間的整數做加法,可以湊出多少個 x,y 區間內的整數?輸入 a,b,x,y,其中1 a b 1000000000,1 x y 1000000000。輸出 用 a,b 內的整數做任意多次加法,可以得到多少個 x,...