BZOJ1607: [Usaco2008 Dec]Patting Heads 輕拍牛頭(模擬 調和級數)
阿新 • • 發佈:2018-06-26
input amp bzoj clas limit ++ 維護 discuss NPU Time Limit: 3 Sec Memory Limit: 64 MB
Submit: 3031 Solved: 1596
[Submit][Status][Discuss]
第1行包含一個整數N,接下來第2到N+1行每行包含一個整數Ai.
2
1
2
3
4
INPUT DETAILS:
The 5 cows are given the numbers 2, 1, 2, 3, and 4, respectively.
0
2
1
3
OUTPUT DETAILS:
The first cow pats the second and third cows; the second cows pats no cows;
etc.
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
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
20
2
1
3
OUTPUT DETAILS:
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 輕拍牛頭(模擬 調和級數)