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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Educational Codeforces Round 14 - F (codeforces 691F)

發(fā)布時(shí)間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Educational Codeforces Round 14 - F (codeforces 691F) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:http://codeforces.com/problemset/problem/691/F

題目大意:給定n個(gè)數(shù),再給m個(gè)詢(xún)問(wèn),每個(gè)詢(xún)問(wèn)給一個(gè)p,求n個(gè)數(shù)中有多少對(duì)數(shù)的乘積≥p

數(shù)據(jù)范圍:2≤n≤10^6, 1≤ai≤3*10^6,1≤m≤10^6, 1≤p≤3*10^6

解題思路:比賽的時(shí)候比較naive的思路是把n中的數(shù)字排序去了重之后,對(duì)于每個(gè)p,最多枚舉√p步,就能得到答案。而這個(gè)naive的思路是O(p√p)的,結(jié)果T了。

后來(lái)百思不得其解,去看了官方的解答。感覺(jué)是一種很有必要總結(jié)的思路。思路的模型是埃氏篩素?cái)?shù)。

篩素?cái)?shù)中枚舉到一個(gè)素?cái)?shù)pr,我們就把MAX范圍內(nèi)的pr的倍數(shù)依次搭上標(biāo)記。這樣做看似暴力,實(shí)際上復(fù)雜度近乎O(n)(其實(shí)是O(MAX/p1+MAX/p2..MAX/pk))

回到這道題目,完全可以借鑒上述思路,從1-MAX枚舉a,再?gòu)?-MAX/a枚舉另一半b,記n個(gè)數(shù)中乘積等于i的對(duì)數(shù)ans[i],那么就有ans[a*b] += cnt[a]*cnt[b];其中cnt[i]表示n個(gè)數(shù)中i這個(gè)數(shù)出現(xiàn)了多少次。仔細(xì)分析復(fù)雜度的話(huà)是O(MAX/1+MAX/2+MAX/3+...+MAX/MAX),事實(shí)上,這個(gè)東西是接近O(MAXlogMAX)的,這種思想在處理一些數(shù)論問(wèn)題中同樣很有借鑒意義。我認(rèn)為這種思路復(fù)雜度的支撐點(diǎn)在于他有一個(gè)上限MAX,并且內(nèi)部的操作是相乘。

最后得到了ans[i]之后取個(gè)前綴和就得到了n個(gè)數(shù)中乘積<p的對(duì)數(shù),用總對(duì)數(shù)一減就得到了答案。

#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long LL;const int MaxN = 3e6; int n, m, MaX; int a[MaxN + 5], p[MaxN + 5]; LL cnt[MaxN + 5], sum[MaxN + 5];int main() {while (~scanf("%d", &n)) {memset(cnt, 0, sizeof(cnt));memset(sum, 0, sizeof(sum));for (int i = 1; i <= n; i++) scanf("%d", &a[i]), cnt[a[i]]++;scanf("%d", &m); MaX = -(1 << 30);for (int i = 1; i <= m; i++) scanf("%d", &p[i]), MaX = max(MaX, p[i]);for (int i = 1; i <= MaX; i++)for (int j = 1; i * j <= MaX; j++)if (i != j) sum[i * j] += cnt[i] * cnt[j];else sum[i * j] += cnt[i] * cnt[i] - cnt[i];for (int i = 1; i <= MaX; i++) sum[i] += sum[i - 1];for (int i = 1; i <= m; i++) printf("%I64d\n", (LL)n * (n - 1) - sum[p[i] - 1]);} } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/ChopsticksAN/p/5727819.html

總結(jié)

以上是生活随笔為你收集整理的Educational Codeforces Round 14 - F (codeforces 691F)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。