BZOJ1607: [Usaco2008 Dec]Patting Heads 轻拍牛头

来源:互联网 发布:上汽通用 知乎 编辑:程序博客网 时间:2024/05/21 19:54

Description

今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏.
贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶牛相邻.N号奶牛与1号奶牛相邻.农夫约翰用很多纸条装满了一个桶,每一张包含了一个独一无二的1到1,000,000的数字.
接着每一头奶牛i从柄中取出一张纸条Ai.每头奶牛轮流走上一圈,同时拍打所有编号能整除在纸条上的数字的牛的头,然后做回到原来的位置.牛们希望你帮助他们确定,每一头奶牛需要拍打的牛.
Input

第1行包含一个整数N,接下来第2到N+1行每行包含一个整数Ai.
Output

第1到N行,每行的输出表示第i头奶牛要拍打的牛数量.
Sample Input

5

2

1

2

3

4

Sample Output

2

0

2

1

3

题目传送门

听说第7版水题多,我就屁颠屁颠跑过来了。
谁知道尼玛就两道题不是权限题!!
怒刷1A.
数学问题,你受到影响就把这一段之内的所有他的倍数累加这个值
啊呀呀,我好像讲不清楚,看代码吧,贼好理解

代码如下:

#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;int a[1110000],s[1110000];int f[1110000];int main(){    int n,maxx=0;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        f[a[i]]++;        maxx=max(maxx,a[i]);    }    for(int i=1;i<=maxx;i++)        if(f[i]!=0)            for(int j=i;j<=maxx;j+=i)                s[j]+=f[i];    for(int i=1;i<=n;i++)printf("%d\n",s[a[i]]-1);    return 0;}

by_lmy

阅读全文
0 0