轻拍牛头

今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏.
贝茜让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

INPUT DETAILS:

The 5 cows are given the numbers 2, 1, 2, 3, and 4, respectively.

Sample Output
2
0
2
1
3

OUTPUT DETAILS:

The first cow pats the second and third cows; the second cows pats no cows;
etc.

解析:
找出输入的所有数中的最大值,之后遍历每一个数,每个数小于最大数的倍数的约数都加一,最后输出每个数的在所给数中的约数个数;
需要注意的是,题中给的“独一无二”的数是错的,给的样例中就有两个2,所以要记录每个数出现的次数,防止重复;

代码:

#include"stdio.h"
int a[100010],s[1000010],book[1000010];
main()
{
	int m,maxx=-1,i,t;
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
    	scanf("%d",&a[i]),
  		book[a[i]]++;
   		if(maxx<a[i])
   		maxx=a[i];
	}
    for(i=0;i<m;i++)
    if(book[a[i]])
    {
        t=a[i];
        while(t<=maxx)
        {
            s[t]+=book[a[i]];
            t+=a[i];
        }
        book[a[i]]=0;
    }
    for(i=0;i<m;i++)
    printf("%d\n",s[a[i]]-1);
    return 0;
}
发布了10 篇原创文章 · 获赞 10 · 访问量 169
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览