BZOJ-1607-[Usaco2008 Dec]Patting Heads 輕拍牛頭
阿新 • • 發佈:2017-10-03
沒有 i++ 題解 bzoj () += one urn ans
5 //有五個數,對於任一個數來說,其它的數有多少個是它的約數
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.
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
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:
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 intView Codemain(){ 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 }
BZOJ-1607-[Usaco2008 Dec]Patting Heads 輕拍牛頭