acwing 1291 輕拍牛頭

2021-10-17 05:26:09 字數 1855 閱讀 7487

acwing 1291. 輕拍牛頭

如果直接用暴力解法,逐個判斷其他的數是不是它的約數,這樣時間複雜度是o(n

2)

o(n^2)

o(n2

),資料規模是105

10^5

105,會超時

假設a

1a_1

a1​是a

2a_2

a2​的約數的話,那麼a

2a_2

a2​就是a

1a_1

a1​的倍數,因此可以做這麼乙個處理,當判定某個數a

ka_k

ak​時,我們可以把這個數字的倍數a

ma_m

am​全部加1,含義是,a

ma_m

am​的約數個數又多了1

但又考慮到可能會有很多個a

ka_k

ak​的值是相同的,所以類似於計數排序的思想,先統計a

ka_k

ak​出現的次數,然後再做上面的操作會方便一些

統計a[i]出現的次數:

for

(int i =

0; i < n; i++

)

cnt[i] != 0,即有某個a

ka_k

ak​出現了,把a

ka_k

ak​的倍數j加上a

ka_k

ak​出現的次數,即j的約數又多了cnt

[ak]

cnt[a_k]

cnt[ak

​]個

for

(int i =

1; i < n; i++

)}

最後,要在所有數中求a

ka_k

ak​約數個數,res

[ak]

res[a_k]

res[ak

​]就是a

ka_k

ak​約數的個數(包括a

ka_k

ak​自己)。可以想象,假設ak=

4a_k = 4

ak​=

4,它在所有數中有兩個約數a1=

a2=2

a_1 = a_2 = 2

a1​=a2

​=2,經過上述操作後,res

[4

]res[4]

res[4]

的值應該是3,所以a

ka_k

ak​的約數個數是res

[ak]

−1=3

−1=2

res[a_k] - 1 = 3 - 1 = 2

res[ak

​]−1

=3−1

=2約數和倍數其實是一對好**,當求約數的時間複雜度過大時,不妨從它倍數的角度來考慮解決問題

#include

using

namespace std;

const

int n =

1e6+

10, m =

1e5+10;

int cnt[n]

, a[m]

, res[n]

;int n;

intmain()

for(

int i =

1; i < n; i++)}

for(

int i =

0; i < n; i++

)printf

("%d\n"

, res[a[i]]-

1);return0;

}

題解 輕拍牛頭

今天是貝茜的生日,為了慶祝自己的生日,貝茜邀你來玩乙個遊戲 貝茜讓n 1 n 100000 頭奶牛坐成乙個圈 除了1號與n號奶牛外,i號奶牛與i l號和i l號奶牛相鄰 n號奶牛與1號奶牛相鄰 農夫約翰用很多紙條裝滿了一 個桶,每一張包含了乙個獨一無二的1到1,000,000的數字 接著每一頭奶牛i...

數學基礎 質數(輕拍牛頭)

問題描述 原題來自 usaco 2008 dec.silver 今天是貝茜的生日,為了慶祝自己的生日,貝茜邀你來玩乙個遊戲。貝茜讓 n頭奶牛坐成乙個圈。除了 1 號與 n 號奶牛外,i 號奶牛與 i 1號和 i 1 號奶牛相鄰,n 號奶牛與 1號奶牛相鄰。農夫約翰用很多紙條裝滿了乙個桶,每一張包含了...

BZOJ 1607 輕拍牛頭

time limit 3 sec memory limit 64 mb submit 1245 solved 650 submit status discuss 今天是貝茜的生日,為了慶祝自己的生日,貝茜邀你來玩乙個遊戲 貝茜讓n 1 n 100000 頭奶牛坐成乙個圈 除了1號與n號奶牛外,i號奶...