卧薪尝胆,厚积薄发。
USACO2008DEC SILVER Patting Heads 轻拍牛头
Date: Tue Sep 25 09:29:27 CST 2018
In Category:
NoCategory
Description:
给出
$n$
个数,对每个数求其他
$n-1$
个数中能整除它的数的个数。
$1\leqslant n \leqslant 100000,1\leqslant a[i]\leqslant 10^6$
Solution:
$n^2$
求肯定是不行的,开一个
$10^6$
大小的桶,记录每个数字出现的个数,然后依次枚举每个数字把他的所有倍数都加上它,这样时间复杂度由调和级数
$\begin{align}\sum_{i=1}^n\frac n i=\ln n+\gamma\end{align}$
得是
$O(n\log n)$
的。
Code:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
inline int read()
{
register int res = 0;
register char c = getchar();
while(!isdigit(c))c = getchar();
while(isdigit(c))
{
res = (res << 1) + (res << 3) + c - '0';
c = getchar();
}
return res;
}
int n;
#define MAXN 100010
int a[MAXN];
#define MAX 1000001
int cnt[MAX];
int ans[MAX];
int main()
{
scanf("%d",&n);
memset(cnt,0,sizeof(cnt));
memset(ans,0,sizeof(ans));
for(int i = 1;i <= n;++i)++cnt[a[i] = read()];
for(int i = 1;i < MAX;++i)
{
if(cnt[i])
{
for(int j = i;j < MAX;j += i)
{
ans[j] += cnt[i];
}
}
}
for(int i = 1;i <= n;++i)printf("%d\n",ans[a[i]] - 1);
return 0;
}
In tag:
玄学
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡