日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

上海计算机协会竞赛平台——整除

發布時間:2025/3/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 上海计算机协会竞赛平台——整除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

?給定?n?個數字構成的一個多重集合:請求出,其中有多少元素不能被任意一個在集合中的其他元素整除?

?

無法通過的做法

int main() {int n;cin >> n;int* num = new int[n];for (int i = 0; i < n; i++) {cin >> num[i];}int count = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i != j) {if (num[i] % num[j] == 0) {count++;break;}}}}cout << n - count;return 0; }

不難看出,這種做法的時間復雜度太高了?

正確的做法

利用?埃式篩法 來做,埃式篩法原本是用來在自然數中尋找素數的,檢查數字n是否為素數大體這么做:做一個標記數組,如果n沒有被標記過,說明它是質數,這時把的倍數全部標記。否則它是合數。

我們先把數字排序,再做一次埃式篩法就行了。

例如,對于例子中的數組中,出現了3,那么認為 6,9,12,15……999999 等數可以被標記為不符合要求的數,但3自己是符合要求的。


建立bool數組:
bool bs[1000010];
該數組表示對應下標的數是否在輸入的一系列數中存在除該數本身之外的因數,如果存在,說明能被整除。
然后每次輸入a時,都將從2*a到1000000的所有a的倍數的下標設為true,最后統計數組中對應下標的元素在集合中且為false的元素的個數即可。
但要注意本題的數字可能重復,一旦重復,則所有相同的數都不滿足不能被整除的條件了。所以建立另一個數組表示某元素是否存在:
bool ea[1000010];
在輸入a后,如果ea[a]為false,則說明a尚不存在,將其設為true并執行將a的倍數設置的操作;如果ea[a]存在,則將bs[a]直接設為true。
?

解題代碼

#include<iostream> using namespace std; bool bs[1000010]; bool ea[1000010];int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {int a;cin >> a;if (!ea[a]) {ea[a] = true;}else {bs[a] = true;}for (int j = a + a; j <= 1000000; j += a) {bs[j] = true;}}int ans = 0;for (int i = 1; i <= 1000000; i++) {if (!ea[i]) continue;ans += !bs[i];}cout << ans;return 0; }

?

總結

以上是生活随笔為你收集整理的上海计算机协会竞赛平台——整除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。