洛谷P2926:https://www.luogu.org/problemnew/show/P2926
思路
对于每一个出现的数 从1到Max 凡是这个数的倍数 那么ans就加上他的个数
PS:最后要把本身去掉
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 1000010
int n,Max;
int a[maxn],num[maxn],ans[maxn];
//num记录每个数字的个数
//ans记录每个数字的答案
int main()
{
scanf("%d",&
n);
for(
int i=
1;i<=n;i++
)
{
scanf("%d",&
a[i]);
num[a[i]]++;
//这个数字出现次数加1
Max=max(Max,a[i]);
//求出所有的最大值为后面循环的范围
}
for(
int i=
1;i<=Max;i++
)
{
if(num[i]==
0)
continue;
//如果没有出现这个数字则跳过
for(
int j=i;j<=Max;j+=
i)
ans[j]+=num[i];
//i能被j除就把ans[j]加上num[i],累计j的答案
}
for(
int i=
1;i<=n;i++
)
printf("%d\n",ans[a[i]]-
1);
//减去本身
}
View Code
转载于:https://www.cnblogs.com/BrokenString/p/9655634.html
相关资源:JAVA上百实例源码以及开源项目