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

2021-09-09 06:02:10 字數 1257 閱讀 4016

問題描述

原題來自:usaco 2008 dec. silver

今天是貝茜的生日,為了慶祝自己的生日,貝茜邀你來玩乙個遊戲。

貝茜讓 n頭奶牛坐成乙個圈。除了 1 號與 n 號奶牛外,i 號奶牛與 i−1號和 i+1 號奶牛相鄰,n 號奶牛與 1號奶牛相鄰。農夫約翰用很多紙條裝滿了乙個桶,每一張包含了乙個 1 到 10 6的數字。

接著每一頭奶牛 i 從桶中取出一張紙條 ai ,每頭奶牛輪流走一圈,同時拍打所有「編號是 ai 的約數」的牛,然後走回到原來的位置。牛們希望你幫助他們確定,每一頭奶牛需要拍打的牛。

輸入

第一行包含乙個整數 n;

接下來第二到第 n+1 行每行包含乙個整數 ai 。

輸出

第一到第 n 行,第 i 行的輸出表示第 i 頭奶牛要拍打的牛數量。

樣例輸入5

2123

4樣例輸出2

0213

提示

對於全部資料,1≤n≤105 。

問題分析

看完題目第乙個想法是列舉的n2,之後發現完全可以用桶來記元素,然後通過類似於篩法求素數的方法,求出某乙個元素的倍數的個數,-1即為答案。

演算法設計

先讀入統計一遍所有的數,之後因為每個數隻會被比他小的因數除去,所以列舉每個數的倍數。最好把一樣的數用陣列儲存,不然可能乙個個篩會超時。然後就是要注意j要從i而不是2i開始列舉,因為可能存在相同的數字,最後給ans減1就好了。

**

#include#includeusing namespace std;

const int n=1e6+10;

int n,a[n],cnt[n],ans[n],maxn;

int main()

for(int i=1;i<=maxn;i++)

}       for(int i=1;i<=n;i++)

printf("%d\n",ans[a[i]]-1);

return 0;

}

演算法複雜度分析

使用列舉法的演算法複雜度為o(n2);利用上述的篩選法,並且將相同的數字合併能夠到乙個陣列中一起計算,演算法複雜度下降到o(nloga)。

題解 輕拍牛頭

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

acwing 1291 輕拍牛頭

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 的倍數,因此可...

BZOJ 1607 輕拍牛頭

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