輕拍牛頭(類埃式篩)

2022-06-09 02:51:07 字數 1471 閱讀 5091

題目鏈結

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

貝茜讓 n

'>n 頭奶牛坐成乙個圈。除了 1

'>1號與 n

'>n 號奶牛外,i

'>i 號奶牛與 i−1

'>i−1 號和 i+1

'>i+1 號奶牛相鄰,n

'>n號奶牛與 1

'>1 號奶牛相鄰。農夫約翰用很多紙條裝滿了乙個桶,每一張包含了乙個 1

'>1 到 10

6'>106

的數字。

接著每一頭奶牛 i

'>i 從桶中取出一張紙條 a

i'>ai ,每頭奶牛輪流走一圈,同時拍打所有「編號是 a

i'>ai 的約數」的牛,然後走回到原來的位置。牛們希望你幫助他們確定,每一頭奶牛需要拍打的牛。

第一行包含乙個整數 n

'>n;

接下來第二到第 n+1

'>n+1 行每行包含乙個整數 a

i'>ai 。

第一到第 n

'>n行,第 i

'>i行的輸出表示第 i

'>i 頭奶牛要拍打的牛數量。

521

234

202

13

對於全部資料,1≤n

≤105'>1≤n≤105

。sol:題意有點玄學,對於ai,找出所有 ai%aj==0 的 aj 個數(j≠i)

所以對於乙個數ai,對於所有j%i==0的數字有1的貢獻,寫個像埃氏篩一樣的東西就好了

#pragma gcc optimize(1)

#pragma gcc optimize(2)

#pragma gcc optimize(3,"ofast","inline")#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;template

void read(tp &x)

if(ch=='-'

)else fh=1

;

while(ch>='

0'&&ch<='9'

) x*=fh;

}inline

char read1()//

字串讀入掛

const

int maxn=1e6+100

;int

a[maxn];

intvis[maxn];

intans[maxn];

intmain()

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

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

cout

<}

埃式篩與尤拉篩

核心思想 每個質數的倍數都是合數,當發現乙個質數時就將其的倍數都變成合數。缺點 有的合數會被它的幾個質因子重複篩掉,造成了時間上的浪費。include include using namespace std int n,q,cnt,k bool isprime 100000005 int sushu...

埃式篩法 尤拉篩法

埃氏篩法是通過從小到大篩去乙個已知素數的倍數進而實現篩選的。假如我們想篩掉1 100間的所有合數,步驟如下 2是質數,篩掉所有2的倍數 3是質數,篩掉所有3的倍數 4不是質數,跳過 5是質數,篩掉所有5的倍數 6不是質數,跳過 7是質數,篩掉所有7的倍數 8不是質數,跳過 9不是質數,跳過 10不是...

演算法筆記 素數篩(樸素篩,埃式篩,尤拉篩)

素數也叫質數,是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。如2 3 5 7 11等。素數篩即篩選出1 n內的素數的方法,這裡介紹三種 由上面的概念得,我們可以想到引入乙個從1到它本身的for迴圈,只要中間有取余為0,那麼它就不是素數。define max 100000 int ...