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號奶...