1. 程式人生 > >BZOJ-1607-[Usaco2008 Dec]Patting Heads 輕拍牛頭

BZOJ-1607-[Usaco2008 Dec]Patting Heads 輕拍牛頭

沒有 i++ 題解 bzoj () += one urn ans

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

Silver

題解

這道題要你求其他的數中有幾個是當前這個數的約數

我們考慮用數組記錄下每個數出現的次數

每次枚舉i和j表示i是j的約數,把i這個數出現的次數加到ans[j]中,因為每個數它自己也被算進去了,所以輸出的時候要-1

但是這樣還是有可能要T

所以我們的循環只要循環到讀入的數中最大的就可以了

還有一個就是判斷一下i這個數有沒有出現過,沒有出現過後面枚舉的j也就沒有用了

技術分享
 1 #include<bits/stdc++.h>
 2 #define N 100005
 3 #define M 1000005
 4 using namespace std;
 5 int n,Max;
 6 int a[N];
 7 int t[M],num[M];
 8 int
main(){ 9 scanf("%d",&n); 10 for (int i=1;i<=n;i++){ 11 scanf("%d",&a[i]); 12 t[a[i]]++; 13 Max=max(Max,a[i]); 14 } 15 for (int i=1;i<=Max;i++) 16 if (t[i]) 17 for (int j=i;j<=Max;j+=i) 18 num[j]+=t[i]; 19 for (int i=1;i<=n;i++) 20 printf("%d\n",num[a[i]]-1); 21 return 0; 22 }
View Code

BZOJ-1607-[Usaco2008 Dec]Patting Heads 輕拍牛頭