• CodeForces


    A number is called almost prime if it has exactly two distinct prime divisors. For example, numbers 6, 18, 24 are almost prime, while 4, 8, 9, 42 are not. Find the amount of almost prime numbers which are between 1 and n, inclusive.

    Input

    Input contains one integer number n (1 ≤ n ≤ 3000).

    Output

    Output the amount of almost prime numbers between 1 and n, inclusive.

    Examples Input

    10

    Output

    2

    Input

    21

    Output

    8

    如果数字恰好具有两个不同的素数除数,则称为几乎素数。 例如,数字6、18、24几乎是质数,而数字4、8、9、42不是。 找出介于1和n之间(含1和n)的几乎质数的数量。

    输入值
    输入包含一个整数n(1≤n≤3000)。

    输出量
    输出1到n之间(含1和n)的几乎质数的数量。

    例子
    输入
    10
    输出
    2
    输入
    21
    输出
    8

    这道是CF上的题目,我选择了用打表+set做的,题意是输出1-n中几乎质数的数量,几乎质数就是有两个不同质数的除数,即有两个不同的质因子,这里开一个前缀和数组sum,下标存放的是1-i的几乎质数的个数,因为集合的去重性,用集合才存储不同的质因子,一旦szie等于2则说明该数是几乎质数,数据最大到3000,最后打表直接输出sum[n]的值即可。AC代码

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <set>
    #include <cstring>
    using namespace std;
    const int _max=3e3+50;
    int sum[_max]={0};//前缀和数组
    int main()
    {
    	bool check(int);
    	for(int i=1;i<=3000;i++)
    	{
    		if(check(i))//判断一下这个数是不是几乎质数
    		  sum[i]=sum[i-1]+1;
    		else
    		  sum[i]=sum[i-1];  
    	}
    	int n;
    	cin>>n;
    	cout<<sum[n]<<endl;
    	return 0;
    }
    bool check(int s)
    {
    	set<int >beg;
    	for(int i=2;i*i<=s;i++)//分解质因子的过程
    	  while(s%i==0)
    	  {
    	  	beg.insert(i);
    	  	s/=i;
    	  }
    	if(s!=1)
    	  beg.insert(s);
    	if(beg.size()==2)//等于2则返回true
    	  return true;
    	return false;    
    }
    
  • 相关阅读:
    动态生成Zip
    Net 项目构建基于Jenkins + Github + Mono 的持续集成环境
    net中使用ETW事件
    JS模板引擎
    DDD事件总线
    ASP.NET5 Beta8
    Big ball of Mud
    Jil序列化JSON
    DotNetOpenAuth实践
    centos安装wget 及配置(转)
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294324.html
Copyright © 2020-2023  润新知