1 条题解

  • 4
    @ 2024-10-12 19:39:09

    题意

    对于数组aa中的每个元素 aia_i,判断该 aia_i的所有因子是否都存在在数组中。

    对于本题1n106 1 \le n \le 10^61ai1061\le a_i \le 10^6 ,暴力判断时间复杂度为ain\sqrt a_i*n,显然超时.

    因此可以使用类似于素数筛的方法来筛出未出现数字的倍数,来判断aia_i是否被标记 时间复杂度为 nloglognn loglogn

    注意去重! 一个数可以出现两次。

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll a[1000005];
    ll b[1000005];
    ll c[1000005];
    int main()
    {
    	 ll n;
    	 scanf("%lld",&n);
    	 ll mx=0;
    	 for(ll i=1;i<=n;i++)
    	 {
    		scanf("%lld",&a[i]);
    		 b[a[i]]=1;//标记每个出现的数
    		mx=max(a[i],mx);//找出最大的数max
    	 }
    	 for(ll i=1;i<=mx;i++)//遍历1-mx
         {
    		if(b[i]==0)//如果该数没有出现
    		{
    			for(ll j=i;j<=mx;j+=i)//筛法,筛出所有倍数
    			{
    				c[j]=1;
    			}
    		}
    	 }
    	 ll ans=0;
    	 for(ll i=1;i<=1e6;i++)//这种遍历可以免去去重
    	 {
            if(c[i]==0&&b[i]==1)//如果该数出现并且没有被筛到,说明他的因子全在数组中,对答案贡献+1
    		  ans++;
    	 }
    	 printf("%lld\n",ans);
    }
    
    • @ 2024-10-15 16:33:07

      每个数值是一天吗,我以为每个ai元素算是一天, 统计答案写成了 ans += cnt[i]出现次数。坑😄 。

  • 1

仲夏学长的自行车又生锈了!!!!

信息

ID
1015
时间
1000ms
内存
256MiB
难度
9
标签
递交数
184
已通过
18
上传者