1. 程式人生 > >JZ模擬賽 8.10

JZ模擬賽 8.10

歐幾裏得 tftp 復雜度 沒有 復雜 fdt elf aaa cit

B組:

階乘

Description

有n個正整數a[i],設它們乘積為p,你可以給p乘上一個正整數q,使p*q剛好為正整數m的階乘,求m的最小值。

Data Constraint

對於10%的數據,n<=10
對於30%的數據,n<=1000
對於100%的數據,n<=100000,a[i]<=100000
Solution:

對於所有數據,不能直接乘。考慮質因數分解。

n根號n分解a[i],把所有的a[i]指數相加,就是p的質因數分解。

p=2^q1*3^q2*5^q3....

m的階乘質因數分解至少有q1個2,q2個3。。。

m的階乘有多少個質因子2呢?

[m/2]+[m/2^2]+[m/2^3]....([]是下取整)

對於3、5同理

所以,就二分一個m,找一下階乘中所有質數指數是幾,大於qi可能是答案。

復雜度:n根號n + log(long long)*(小於100000質數個數,數量小於10000個)*logpim

T2:

Description

小S是一個愛鍛煉的孩子,他在放假期間堅持在A公園練習跑步。
但不久後,他就開始為在重復的地點練習感到厭煩了,他就打算去B公園跑步。
但是小S由於沒有去過B公園,他不知道B公園是否適合練習跑步,又不知道在B公園怎樣跑是最優的。所以小S就去B公園進行了一番勘測。
小S在進行了一番勘測後,畫出了一張地圖,地圖每一個位置上都辨識了小S到達該位置後不能往哪一個方位移動。其中有5種表示的符號:“U”代表不能向上移動,“D”代表不能向下移動,“L”代表不能向左移動,“R”代表不能向右移動,如果該位置有障礙物,小S到達那裏後無法繼續訓練,就用“S”來代表。整個公園共有n行m列,小S會從第1行第1列出發,到第n行第m列結束他的練習。
現在小S想要知道,從起點(即第1行第1列)到終點(第n行第m列),途中最少要改變幾次方向(即上一次移動的方向和這一次移動的方向不一樣)?
註意:小S如在訓練途中離開公園(即地圖範圍),則算是結束訓練。

  n,m<=500

Solution:

bfs爆搜即可。加一個最優性剪枝。

T3:

Description

2018年1月31日,152年一遇的超級大月全食在中國高空出現(沒看到的朋友真是可惜),小B看到月食,便對月球的軌道產生了興趣。他上網查重力加速度的公式,公式如下:

技術分享圖片
就在這個時候,他想到了一個跟這個差不多的問題,那就是對於以下公式:
技術分享圖片
已知n和k,求這n個正整數在都不大於m的情況下有多少種選擇方式,使得v為與k互質正整數?

Data Constraint

數據範圍
對於20%的數據 1<=n,m<=8 k<=100
對於40%的數據 1<=n<=50 1<=m<=10^6 1<=k<=10^4
對於70%的數據 1<=n<=100 1<=m<=10^9 1<=k<=10^7
對於100%的數據 1<=n<=3000 1<=m<=10^9 1<=k<=10^7 Solution:

題出的不錯。 20分暴力。 dp? 設f[i][j]表示,前i個數,乘積為j的方案數。 乘積太大放不下。 發現,要判斷除完了能整除,並且除完了和k互質,就可以。 也就是說,乘積一定是k的倍數,並且,乘積中的每一個在k中出現的質因子,不能在乘積出現次數多於其在k中的出現次數。 直接講滿分思路: 設f[i][j]表示,前i個數,乘積和k的最大公約數是k的第j個約數的方案數。 最後的答案就是,f[i][cnt] k最後一個約數就是自己。 轉移方程:f[i][j]=f[i-1][k]*( ..... ) (a[j]%a[k]==0) a[j]表示,k的第j個因數是幾。 顯然,第j個約數想要轉移過來,必須從a[j]的某個約數a[k]乘上剩下的a[j]/a[k]轉移過來。

所以用一下乘法原理,就是乘上f[1][num[a[j]/a[k]]] num表示,這個約數是k的第幾個約數。

就是填一個數,使得和k的gcd是第a[j]/a[k]個因數的方案數。

(顯然,a[j]/a[k]是k的一個因數,所以可以直接放進f[][]裏表示。)

所以,我們要預處理f[1][p],

類似longge的問題,(我的方法和網上的不一樣)

[SDOi2012]longge的問題

直接枚舉k的因子,然後容斥即可。

最後dp一下。

發現,3000*(因數個數)^2 會TLE。

那麽,因為轉移的時候,a[j]%a[k]==0,所以a[k]是a[j]的因數,可以預處理a[j]的所有也是k的因數的因數。

也可以,在枚舉的時候,直接枚舉到根號a[j]即可,另一半直接算出來。

A組:

T1:

旅行

悠悠歲月,不知不覺,距那傳說中的pppfish晉級泡泡帝已是過 去數十年。數十年 中,這顆泡泡樹上,也是再度變得精彩,各種泡泡 天才輩出,驚艷世人,然而,似乎 不論後人如何的出彩,在他們的頭 頂之上,依然是有著一道身影而立。 泡泡帝,pppfish。 現在,pppfish即將帶著被自己收服的無數個泡泡怪前往下一個 空間,而在前往下 一個空間的道路上,有N個中轉站,和M條空間蟲洞連接中轉站(雙向通道,可有重 邊,可有環),然而,通過蟲洞 是要一定的條件的,pppfish將手下所有泡泡怪編號為 1,2 … +∞,對於每個空間蟲洞,有兩個值L和R,表示此蟲洞只允許編號從L到 R的泡 泡怪通過,pppfish現在在1號中轉站,他想帶盡可能多的泡 泡怪到達N號中轉站,於是 pppfish找到了機智的你,希望你告訴 他最多可以帶多少個泡泡怪,同時他還想知道所 有泡泡怪的編號(若 有多組解取字典序最小的一組 )

Data Constraint

30%的數據 1 <= N,M <= 10
100%的數據 2 <= N <= 1000, 0 <= M <= 3000, 1 <= a, b <= N, 1 <= l <= r <= 10^6

Solution:

枚舉左端點,二分右端點,然後並查集判斷聯通?logle6*1e6*3000不行。

但是,最終的L,R必定是出現過的l,r!!!!只有3000個!!

所以,3000*log3000*3000可以過。

T2:

技術分享圖片

技術分享圖片

Solution:

傷心的題,差點做對。。

考慮前綴問題,一定是要trie了。把Ti放進trie裏,

起初我的做法是:每個點記錄是否是,是哪個si的結尾,然後,每個點開一個vector,從所有的ti的結尾的點,放進vector裏,從葉子開始向上歸並,到了一個有si結尾的點,最長0的長度就是相鄰編號的差的最大值。

然後,MLE!!

其實不用這麽麻煩了。

因為我們只要知道經過一個點相鄰編號差的最大值,而我們的Ti從1~n插入,,

所以,每個trie上點維護一個las,mx值,表示上一次經過這個點的T的編號,和當前編號最大值。

每次經過一個點,就把這個編號和las做差-1嘗試更新mx,開始把0,最後把n+1也加進去做個差

這樣就統計出了trie上每一個點的答案。

然後不就想怎麽做就怎麽做???

插入si,到末尾直接查詢!

T3:

劃分

有一個未知的序列x,長度為n。它的K-劃分序列y指的是每連續K個數的和得到劃分序列,y[1]=x[1]+x[2]+....+x[K],y[2]=x[K+1]+x[K+2]+....+x[K+K]....。若n不被K整除,則y[n/K+1]可以由少於K個數加起來。比如n=13,K=5,則y[1]=x[1]+...+x[5],y[2]=x[6]+....+x[10],y[3]=x[11]+x[12]+x[13]。若小A只確定x的K[1]劃分序列以及K[2]劃分序列....K[M]劃分序列的值情況下,問她可以確定x多少個元素的值。

Sample Input

【輸入樣例1】
3 1
2
【輸入樣例2】
6 2
2 3
【輸入樣例3】
123456789 3
5 6 9

Sample Output

【輸出樣例1】
1
【輸出樣例2】
2
【輸出樣例3】
10973937

Hint

【樣例1解釋】
小A知道x的2-劃分序列,即分別知道x[1]+x[2],x[3]的值。
小A可以知道x[3]的值。
【樣例2解釋】
小A知道x的2-劃分序列,即分別知道x[1]+x[2],x[3]+x[4],x[5]+x[6] 的值。
小A知道x的3-劃分序列,即分別知道x[1]+x[2]+x[3] ,x[4]+x[5]+x[6] 的值。
小A可以知道x[3],x[4]的值,個數為2.

Data Constraint

對於20%的數據,3 <= N <= 2000,M<=3。
對於40%的數據,3 <= N <= 5*10^6。
對於100%的數據,3 <= N <= 10^9 , 1 <= M <= 10,2 <= K[i] < N。 Solution: 說白了,一個x的值能被確定, 需要先知道一點,假如 x[p]能夠求出來,那麽必定存 在一對(i,j), 滿足 P mod k[i]=0,p mod k[j]=1 相當於 p=a1*k[i]=a2*k[j]+1 即 a1*k[i]-a2*k[j]=1, 這個就可以用擴展歐幾裏得算法 來求通解,並且我們可以知道,有解的條件必定是 gcd(k[i],k[j])=1. 但是,這樣做會重復計算 我們從m個數中選擇的組合, 就是所有的(i,j)但是,可能存在: P mod k[i]==0 P mod k[j]==0 P mod k[c]==1 這個P會被算兩次。 所以,考慮容斥 P mod k[i]==0 P mod k[j]==0的P 相當於 P mod lcm ==0的P mod lcm ==1 也一樣 所以,對於每一個k, 可以把它放進mod1的集合裏,也可以放進mod0 的集合裏,也可以不放進去 有三種情況。 3^m枚舉選擇情況。 系數是:(-1)^(|a|+|b|)第一個集合size+第二個集合size 然後每次用exgcd做一下就好了。 邊界情況再處理一下。

JZ模擬賽 8.10