C NOIP模擬題 動態分班

2021-07-30 00:21:01 字數 1241 閱讀 5654

某中學對班級實行動態管理,每學年結束後都要重新分配班級,但這所學校重新分配的方法和石室中學完全不同。

現在給出一些屬於同一年級學生的連續編號,它們都是從 a 到 b 的整數。一開始每個編號都屬於各自不同的班(即乙個班只有乙個學生),然後學校將進行以下的調整:每次選擇兩個屬於不同班的編號,如果這兩個編號擁有大於或等於 p 的公共質因數,那麼就把她們所在的班合併成乙個班。反覆上述操作,直到沒有可以合併的班為止。

現在請你求出最後這個年級有多少個班?

一行,三個整數 a,b,p,其中 a≤b≤100000,2≤p≤b。

輸出乙個數表示最終班的個數。

輸入

10 20 3
輸出

7

【樣例說明】

樣例解釋:最後只有 7 個班:,,,,,,

【資料規模】

80% 的資料 b≤1000;

100% 的資料 b≤100000。

解題報告:

可以暴力判斷兩個點之間是否有邊,然後求圖的聯通塊個數,可以過80%。

乙個數最多可能擁有的不同質數的個數是6個,2*3*5*7*11*13=30030。

我們可以列舉範圍內所有合理的質數,對於質數p,我們可以把p的倍數的所有數合成乙個集合。由於乙個數最多有6個質數,所以每個數最多被找到6次。統計的時候,我們可以對每個質數建乙個點,然後和屬於它倍數的數連邊,最後求出聯通塊的個數就可以了。

用並查集壓縮路徑;用篩法求素數。

時間複雜度:o((b-a)*6)

附錄:遞迴壓縮路徑可能會造成溢位棧,非遞迴寫法如下:

int find(int x)

return r;             //返回根節點的值            

}

#includeint a,b,p,o,t,ans;

int c[100001],father[100001];

bool fil[100001],h[100001];

inline int getfather(int v)

int main()

for(int i=a;i<=b;++i) father[i]=i;

for(int i=1;i<=c[0];++i)

if(c[i]>=p)

}for(int i=a;i<=b;++i) }

printf("%d\n",ans);

return 0;

}

C NOIP模擬題 裝果子

果園裡有 n 顆果樹,每棵果樹都有乙個編號 i 1 i n 小明已經把每棵果樹上的果子都摘下來堆在了這棵樹的下方,每棵樹下方的果子體積為 ai。現在小明將拿來 m 個袋子把這些果子都裝進袋子裡。每個袋子的體積為 v 小明會按照如下規則把果子裝進袋子裡 a 從第 1 棵果樹開始裝起,由 1 到 n 一...

C NOIP模擬題 列車排程

161114 練習 day1 ahsdfz t2 有 n 輛列車,標記為 1,2,3,n。它們按照一定的次序進站,站台共有 k 個軌道,軌道遵從先進先出的原則。列車進入站台內的軌道後可以等待任意時間後出站,且所有列車不可後退。現在要使出站的順序變為 n,n 1,n 2,1,詢問 k 的最小值是多少。...

C NOIP模擬題 間諜網路

由於外國間諜的大量滲入,正處於高度危機之中。如果a間諜手中掌握著關於b間諜的犯罪證據,則稱a可以揭發b。有些間諜接 賂,只要給他們一定數量的美元,他們就願意交出手中掌握的全部情報。所以,如果我們能夠收買一些間諜的話,我們就可能控制間諜網中的每一分子。因為一旦我們逮捕了乙個間諜,他手中掌握的情報都將歸...