【题目描述】
原题来自:USACO 2008 Dec. Silver
今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏。
贝茜让 N 头奶牛坐成一个圈。除了 1 号与 N 号奶牛外,i 号奶牛与 i−1 号和 i+1 号奶牛相邻,N 号奶牛与 1 号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张包含了一个 1 到 106 的数字。
接着每一头奶牛 i 从桶中取出一张纸条 Ai ,每头奶牛轮流走一圈,同时拍打所有「编号是 Ai 的约数」的牛,然后走回到原来的位置。牛们希望你帮助他们确定,每一头奶牛需要拍打的牛。
【输入】
第一行包含一个整数 N;
接下来第二到第 N+1 行每行包含一个整数 Ai 。
【输出】
第一到第 N 行,第 i 行的输出表示第 i 头奶牛要拍打的牛数量。
【输入样例】
5 2 1 2 3 4
【输出样例】
2 0 2 1 3
【提示】
数据范围与提示:
对于全部数据,1≤N≤105 。
事实上这道题放在“质数”里面好像没什么道理,最多就是用到了一点类似于埃拉托色尼筛法的思想
放上代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+1; 4 int a[N],n,Max,ans[N*100],cnt[N*100]; 5 inline int read() 6 { 7 int x=0,f=1; 8 char ch=getchar(); 9 while(ch<'0'||ch>'9') 10 { 11 if(ch=='-') f=-1; 12 ch=getchar(); 13 } 14 while(ch>='0'&&ch<='9') 15 { 16 x=x*10+ch-'0'; 17 ch=getchar(); 18 } 19 return x*f; 20 } 21 inline void write(int x) 22 { 23 if(x<0) 24 { 25 putchar('-'); 26 x=-x; 27 } 28 if(x>9) write(x/10); 29 putchar(x%10+'0'); 30 } 31 int main() 32 { 33 n=read(); 34 for(int i=1;i<=n;i++) 35 { 36 a[i]=read(); 37 cnt[a[i]]++; 38 Max=max(Max,a[i]); 39 } 40 for(int i=1;i<=Max;i++) 41 { 42 if(cnt[i]) 43 { 44 for(int j=i;j<=Max;j+=i) 45 ans[j]+=cnt[i]; 46 } 47 } 48 for(int i=1;i<=n;i++) 49 { 50 write(ans[a[i]]-1); 51 putchar('\n'); 52 } 53 return 0; 54 }