轻拍牛头(信息学奥赛一本通 1621)

梦想与她 提交于 2019-11-27 21:29:20

【题目描述】

原题来自: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

【提示】

数据范围与提示:

对于全部数据,1N105 。


 

事实上这道题放在“质数”里面好像没什么道理,最多就是用到了一点类似于埃拉托色尼筛法的思想

放上代码:

 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 }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!