B1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 数学

今天净做水题了,这个题还不到十五分钟就搞定了,思路特别简单,就是直接按照线性求因子个数的思路就行了。

题干:

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
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.

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = 1 << 30;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
    char c;
    bool op = 0;
    while(c = getchar(), c < '0' || c > '9')
        if(c == '-') op = 1;
    x = c - '0';
    while(c = getchar(), c >= '0' && c <= '9')
        x = x * 10 + c - '0';
    if(op) x = -x;
}
template <class T>
void write(T x)
{
    if(x < 0) putchar('-'), x = -x;
    if(x >= 10) write(x / 10);
    putchar('0' + x % 10);
}
int n,a[100010];
int num[1000010];
int x[1000010],maxn = 0;
int main()
{
    read(n);
    duke(i,1,n)
    {
        read(a[i]);
        maxn = max(maxn,a[i]);
        num[a[i]]++; 
    }
    for(int i = 1;i <= maxn;i++)
    {
        if(num[i] != 0)
        {
            for(int j = 2 * i;j <= maxn;j += i)
            {
                x[j] += num[i];
            }
        }
    }
    duke(i,1,n)
    {
        printf("%d\n",x[a[i]] + num[a[i]] - 1);
    }
    return 0;
}
/*
5
2
1
2
3
4
*/

 

posted @ 2018-08-25 22:28  DukeLv  阅读(219)  评论(0编辑  收藏  举报