1. 程式人生 > >BZOJ1607: [Usaco2008 Dec]Patting Heads 輕拍牛頭(模擬 調和級數)

BZOJ1607: [Usaco2008 Dec]Patting Heads 輕拍牛頭(模擬 調和級數)

input amp bzoj clas limit ++ 維護 discuss NPU

Time Limit: 3 Sec Memory Limit: 64 MB
Submit: 3031 Solved: 1596
[Submit][Status][Discuss]

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.

HINT

Source

比較水。。

維護出所有的顏色。

然後按埃氏篩的方法挨個篩就行了

根據調和級數,時間復雜度為$O(nlogn$

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN = 1e5 + 10, INF = 1e9 + 10
; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < 0 || c > 9) {if(c == -) f = -1; c = getchar();} while(c >= 0 && c <= 9) x = x * 10 + c - 0, c = getchar(); return x * f; } int a[1000001], color[MAXN], ans[1000001]; main() { #ifdef WIN32 freopen("a.in", "r", stdin); #endif int N = read(); for(int i = 1; i <= N; i++) color[i] = read(), a[color[i]]++; for(int i = 1; i <= 1000000; i++) { if(!a[i]) continue; for(int j = i; j <= 1000000; j += i) ans[j] += a[i]; } for(int i = 1; i <= N; i++) printf("%d\n", ans[color[i]] - 1); }

BZOJ1607: [Usaco2008 Dec]Patting Heads 輕拍牛頭(模擬 調和級數)