先贴一个题目链接:https://www.nowcoder.com/acm/contest/71/A
题目描述
给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数
输入描述:
第一行输入一个n
接下来一行输入n个正整数a
i
输出描述:
输出符合条件个数
示例1
输入
5
1 2 3 4 5
输出
2
说明
5个数中1和2符合条件,1是后面每个数的因子,2是4的因子
备注:
1≤n,ai≤1000000
题目大意:就是找出所有能被整除的因子。其实这道题一开始就想的循环来做。然后一直超时。所以就必须用优化来解决。
出现的元素用下标标记一下,然后循环一遍。看这个值的倍数的下标被标记没有,为nlogn,不会超时;
下面贴一下AC的代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000010
typedef long long ll;
int a[maxn];
int main()
{
int n;
while(cin>>n)
{
memset(a,0,sizeof a);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[x]++;
}
int ans=0;
for(int i=1;i<=1000000;i++)
{
if(a[i])
{
for(int j=i+i;j<=1000000;j+=i)
{
if(a[j])
{
ans+=a[i];
break;
}
}
}
}
cout<<ans<<endl;
}
return 0;
}