1. 程式人生 > >【原創】【NOI.AC模擬賽第五場】A.序列計數(count)

【原創】【NOI.AC模擬賽第五場】A.序列計數(count)

序列計數(count)

題目描述

長度為n+1的序列A,其中的每個數都是不大於n的正整數,且n以內每個正整數至少出現一次。

對於每一個正整數k=1,…,n+1,求出的本質不同的長度為k的子序列(不一定要連續)的數量。對109+7取模。

輸入格式

第一行一個正整數n。

第二行n+1個正整數A1…An+1,描述序列A。

輸出格式

n+1行,對於第i行,輸出一個整數表示長度為i的本質不同子序列的數量,對10^9+7取模。

樣例

input1

3
1 2 1 3

output1

3
5
4
1

explanation

長度為1的子序列有3個:1 ,2 ,3。

長度為2的子序列有5個:11 ,12 ,13,21,23。

長度為3的子序列有4個:121 ,123 ,113,213。

長度為4的子序列有1個:1213。

input2

見樣例 ex_count2.in。

output2

見樣例 ex_count2.out。

資料範圍和約定

對於20%的資料,n≤20。

對於40%的資料,n≤2000。

對於額外20%的資料,保證A中相同的數一定相鄰。

對於100%​的資料,n≤100000​,1≤Ai≤n​。

時間限制:1s 空間限制:512MB

真的沒有寫部落格所以就把考試寫的思路發上來了所以語無倫次看不懂我也非常抱歉請諒解我的**

10
5 2 6 8 4 3 9 1 4 7 10
left=5
right=9

重複的元素記為rix
考慮left和right出現在同一位置的可能性,這樣就本質相同了,此時應減去其情況數

設當前選i個,rix出現在第j位上。
先考慮左邊的那個rix
a1 a2 a3 … aj-1 rix aj+1 … ai
則a1~aj-1都是rix之前的,aj+1到ai都是rix之後的
情況數為C(lef-1,j-1)*C(i-lef,i-j)

考慮lef,rig兩種情況中重複的選擇情況數為:
C(lef-1,j-1)*C(N+1-rig,i-j),
j∈[1,i]且滿足lef-1>=j-1,N+1-rig>=i-j,
所以j∈[max(1,i+rig-N-1),min(i,lef)]
故答案為:C(N+1,i)-ΣC(lef-1,j-1)*C(N+1-rig,i-j)(j的範圍如上)

這個方法對所有i∈[1,N+1]成立
可是這個做法是O(N^2)的
肯定過不了
肯定會被大佬嘲笑
所以要麼優化要麼換一個方法
反正答案應該是O(N)的吧
優化就是一個思路:
考慮能不能把那個Σ變成O(1)的
怎麼變成O(1)的呢?
1.考慮通過神奇的數學公式變成O(1)的
2.考慮有沒有遞推關係

主要是把減數那一坨Σ化簡,發現C(lef-1,j-1)可以提出來,所以ΣC(lef-1,j-1)*C(N+1-rig,i-j)=C(lef-1,j-1)*ΣC(N+1-rig,i-j)。其中i-j的範圍為(i-j)∈[i-min(i,lef),i-max(1,i+rig-N-1)]。

我們再來化簡ΣC(N+1-rig,i-j)。

先把類分開來討論:
① 1<=i+rig-N-1時:即i>=N-rig+2時:
Ⅰ. i<=lef 時,i-j ∈[0,N+1-rig] , ΣC(N+1-rig,i-j) 就可以很偷稅地二項式定理,此時原式=C(lef-1,j-1)(2^(N+1-rig))
Ⅱ. i>lef 時,i-j ∈[i-lef,N+1-rig],可以先求一個字首和,再用二項式定理減去這個字首和,此時原式=C(lef-1,j-1)
(2^(N+1-rig)-(C(N+1-rig,0)+C(N+1-rig,1)+…+C(N+1-rig,i-lef)))
然後這兩種情況其實可以合併,只需要令下標為負數的字首和為0即可。
(或者乾脆if一下合什麼並有神經病)

②i<N-rig+2時:
Ⅰ. i<=lef 時,i-j ∈[0,i-1] , 發現也是字首和,而且不需要二項式定理。
Ⅱ. i>lef 時,i-j ∈[i-lef,i-1],字首和也可以解決,而且不需要二項式定理。

沒有程式碼

相關推薦

原創NOI.AC模擬A.序列計數(count)

序列計數(count) 題目描述 長度為n+1的序列A,其中的每個數都是不大於n的正整數,且n以內每個正整數至少出現一次。 對於每一個正整數k=1,…,n+1,求出的本質不同的長度為k的子序列(不一定要連續)的數量。對109+7取模。 輸入格式 第一行一個正整數

# NOI.AC省選賽 T1 子集,與&最大值

-i 選擇判斷 所有 trie getchar() const cpp etc inline NOI.AC省選賽 第五場T1 A. Mas的童年 題目鏈接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺簡單的。 ans=max(a

NOIP2016模擬Jams 倒酒(pour) - 擴展歐幾裏得

.com 要求 mes 最大公約數 clas pan can http || Problem Pour 題目大意 一個人要用兩個裝水量一定的杯子互相倒水,求最後能搞出來最少的水量是多少以及倒的次數。 Solution 我們不知道為什麽突然就發現了這個最少的水量一定就

Tree,noi.ac模擬,Hall定理

正題       題目連結點這裡       最小值最大,想到二分。       二分一個答案k,我們把>=k的邊全都刪掉,留下的邊把圖分成了很多個聯通塊,這些聯通塊如果都可以連到外面去的

正環,noi.ac模擬,floyd倍增

正題        題目連結        題意很顯然,求一個最小正環。        如果表示i到j走k步需要多久,那麼我們要找出最小的一個k使得有一個不為0.

題解[牛客網NOIP賽前集訓營-提高組()]A.同餘方程 位運算

#include<cstdio> #include<algorithm> using namespace std; typedef long long ll; const ll mod=998244353; ll m,l1,l2,r1,r2; ll

洛谷金秋夏令營模擬 2 T11737 時之終末

() 技術 style fine bsp cst ++ 個數 += 這道題就是道狀壓dp...比賽的時候太貪心 然後狀壓又不好 所以T2 T3一起掛了QAQ 吸取教訓QAQ f[i][j][k]表示前i個數選了j個 最後a個的狀態為k的答案 #include<cs

牛客網提高組模擬 T3 洞穴(附bitset介紹)

main \n std 個數 fin 輸出 1的個數 define 聲明 就是DP。 我們可以很簡單的想到要枚舉中間點,進行邊數的轉移。 但是因為邊長數據範圍很大,所以我們考慮log的倍增。 狀態設計為\(dp[i][j][k]\),為從節點\(i\)走\(2^k\)

NOIAC 2018模擬

NOIAC 2018模擬賽第三場 cycle 題目傳送門 題目大意:問一張無自環重邊的有向圖,求邊數最小的正環的邊數。 T1就難度中檔了。 考慮一個 O

2018-2019賽季多校聯合新生訓練(2018/12/14)補題題解

A 【字串】ISBN號碼(字串基礎) 字串基礎題,注意一下x的特判即可 程式碼 #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout

中石油新生 問題 A: 春遊

題目描述 小X就讀的CZ 中學今年又取得了小高考的空前佳績,全校師生都很開心,於是大家希望找個地方去春遊,在廣泛徵集了全校師生的意見後,最終決定前往嬉戲谷遊玩一天。出行方案為租用大巴,可供租用的大巴有兩種,一種是49 座的,一種是33 座的,49 座的大巴每輛租金為3300 元,33 座

HDU 6350 2018HDU多校 Always Online(圖論 + 並查集 + 組合計數

          大致題意:給你一個仙人掌圖,讓你計算:。 根據去年多校賽某一道題的經驗,很多仙人掌圖的問題,其實可以轉化為樹的問題。所以我們同樣考慮,如果這是一棵樹的話如何去做。注意到表示式裡面的flow(i,j)表示從i到j的最小割或最大流,而在樹上的最小

NOIP2018模擬2018.10.17刺客信條(AC

題目 題解 –這道題可以用二分,或者是並查集 但是怎麼寫check()是個大問題 首先,你可以發現,對於一個人,他能控制的範圍是個圓 如果不能到終點的情況就是一串圓相連,把起點和終點隔開 所以可以用並查集維護連通性 當邊界剛好聯通的那個就是最遠的距離 程式碼

NOIP模擬(六)花園的守護之神(greendam)-最短路-最大流最小割

greate make rand pair bsp min com solution bool Problem Greemdam 題目大意 給一個圖$G=(V,E)$,求要使這個圖的最短路增長所需要增加的最小權值的值。 Solution 既然是要求這個玩意兒,我們可

模擬題解錦集——Hzoi

質數 spa else align can 11.2 == 問題 輔助 Day IXV:   題目鏈接   T1:    對於二者之一$n$,每次選取要麽變成$2n$,要麽是$n-(tot-n)=2*n-tot$,即最後結果為$n*2^{k}(\mod tot)

模擬 2018-11-023.老大

題目描述 因為 OB 今年拿下 4 塊金牌,學校贊助擴建勞模辦公室為勞模辦公室群,為了體現 OI 的特色,辦公室群被設計成了樹形(n 個點 n − 1 條邊的無向連通圖),由於新建的辦公室太大以至於要將獎盃要分放在兩個不同的地方以便同學們丟硬幣進去開光,OB 想請你幫幫他看看獎盃放在哪兩個辦公室使得在任意一

NOIP2018模擬2018.11.1

預處理優化  一看就知道是快速冪,但是很可惜,暴力快速冪很慢,50分。 考慮分解b,達到O(1)查詢效果  觀察到一個重點l <= 1012,即可知道b <= 1012  於是考慮分解b,分成 x*1e6 + y 的形式,預處理出 a的1 ~ 1e6次方, 然後

NOIP2018模擬2018.10.31

簡單模擬  貪心思想,每次儘量輸出最大的數,維護一個字尾最大值,表示當前位置(包括當前數)到n中的最大值,可以通過倒推得到。  首先棧中壓入第一個數,然後進行比較:若當前位置字尾最大值小於棧頂元素,則彈出棧頂,否則依次壓入棧中直至後面沒有比當前棧頂大的數,如此重複即可。 程式碼如下

NOIP2018模擬2018.10.30

區間DP  明顯的序列合併操作,dalao們想到了區間DP  預處理0~7進行題目所示操作(實際上你會發現就是(a + b)/2)結果(O(1)算也可以),f[l][r][k]代表區間為[l,r]時,可以合併出k,轉移明顯是:  if(f[l1][r1][ki] &&

NOIP2018模擬2018.10.29

正解 邊帶權並查集 具體思路,跟一般的邊帶權並查集一樣,一邊加入並查集,維護每個點到其根的dis,還沒加入的邊預設正確,在加入的邊中進行判斷是否合法。  可以知道,若一次詢問兩個士兵 (設為l,r) 在一個集合中,為了滿足前面的要求,又要滿足這次的要求,必須 dis[l] + d == d