【HDU 5901】Count primes(EES)

Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2745 Accepted Submission(s): 1398

Problem Description
Easy question! Calculate how many primes between [1…n]!

Input
Each line contain one integer n ( 1 &lt; = n &lt; = 1 0 11 ) n(1 &lt;= n &lt;= 10^{11}) n(1<=n<=1011).Process to end of file.

Output
For each case, output the number of primes in interval [1…n]

Sample Input
2
3
10

Sample Output
1
2
4

Source
2016 ACM/ICPC Asia Regional Shenyang Online

其实就是EES的第二部分的运用,设 f ( p ) = 1 f(p)=1 f(p)=1的多项式就可以了
代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define maxx 322005
using namespace std;
int prime[321233],cnt;
int isp[maxx];
void init()
{
    for(int i=2;i<maxx;i++)isp[i]=1;
    for(int i=2;i<maxx;i++)
    {
        if(isp[i])prime[++cnt]=i;
        for(int j=1;j<=cnt;j++)
        {
            ll x=(ll)prime[j]*i;
            if(x>=maxx)break;
            isp[x]=0;
            if(i%prime[j]==0)break;
        }
    }
    for(int i=2;i<maxx;i++)isp[i]+=isp[i-1];
    //cout<<cnt<<endl;
}
ll w[maxx<<1],tot;
int id1[maxx],id2[maxx];
ll g[maxx<<1];
ll solve(ll x)
{
    ll _s=sqrt(x*1.0);
    tot=0;
    for(ll i=1,last;i<=x;i=last+1)
    {
        ll now=x/i;
        w[++tot]=now;
        last=x/now;
        if(now<=_s)id1[now]=tot;
        else id2[last]=tot;
        g[tot]=now-1;
    }
    //cout<<tot<<endl;
    //for(int i=1;i<=tot;i++)
        //cout<<i<<" "<<w[i]<<endl;
    //cout<<"haha"<<endl;
    for(int i=1;i<=cnt&&(ll)prime[i]*prime[i]<=x;i++)
    {
        for(int j=1;j<=tot&&(ll)prime[i]*prime[i]<=w[j];j++)
        {
            ll now=w[j]/prime[i];
            int k=(now<=_s?id1[now]:id2[x/now]);
            g[j]-=(g[k]-(i-1));
        }
        //cout<<g[1]<<endl;
    }
    return g[1];
}
int main()
{
    ll n;
    init();
    //for(int i=1;i<100;i++)
    //cout<<i<<" "<<isp[i]<<" " <<solve(i)<<endl;
    while(scanf("%lld",&n)==1)
    {
        if(n<maxx)printf("%d\n",isp[n]);
        else printf("%lld\n",solve(n));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EES 是工程方程解答器的英文字母的首字母缩写词。EES 的基本功能是解代数方程组。 EES 也能解差分方程、有复杂变量的方程、做工程优化、提供线性和非线性回归并可绘出良好的二维图形。EES 的最早版本开发于 Apple Macintosh 计算机和 Windows 操作系统。这本使用手册描述了基于 Windows 操作系统的 EES 版本,包括 Windows 95/98/2000 和 Windows NT4。 EES 和现有的方程组数值解程序之间有两个主要的差别。首先,EES 自动识别和求解必须同时求解的方程组。这个特点简化了用户的工作并可使解答器永远在最佳效率下工作。其次,EES 提供了很多对工程计算非常有用的内置数学和热物性函数。例如,EES 中内置有蒸汽性质表,根据任意两个物性参数就可通过调用一个内置函数而获得其它的物性参数。对于大多数制冷剂(包括一些新的混合制冷剂)、氨、甲烷、二氧化碳和很多其它流体,也提供了类似的功能。空气性质表是内置的,很多常用气体的 psychrometric 函数和 JANAF 表中的数据一样也是内置的。同样也提供了这些物质的迁移性质。 虽然 EES 中的数学函数和热物性函数库是强大的,但是并不能完全满足每个用户的需要。EES 允许用户用 3 种方式输入他/她自己的函数关系式。首先,在 EES 中插入和添加表格数据非常方便,这样列表数据可以在方程组的求解过程中直接使用。其次,EES 语言支持用户用类似于 Pascal 和 Fortran 语言编写的函数和子程序。EES 也支持用户自己用 EES 语言编写的模块,这些模块可以被其他 EES 程序调用。那些函数、子程序和模块可以当作文件储存,当启动 EES 时这些可自动读取。第三,用任何一种高级语言(例如 Pascal、C 或者Fortran)编写的外置函数和子程序,可以通过使用 Windows 操作系统的动态连接程序库的功能而动态连接到 EES。添加的函数关系式的这三种方法为扩展 EES 的功能提供了非常强有力的手段。 提出 EES 的动机在于热力学和传热学的教学过程。为了学习这些课程,学生经常需要解决问题。对于学生来说,查找物性数据和求解决相似的方程组需要耗费大部分时间和精力,一旦学生熟悉了这些物性数据表,对这些物性数据表的进一步使用并不能对学生的能力有所帮助,对代数表达式的使用也是如此。以通常的方式解决问题所需要的时间和精力实际上消耗了学生学习这些的学习兴趣,因为它迫使学生去关心求解方程组所需要的语句(其实无关紧要)而使学习非常费力。一些涉及到热力学和传热学的有趣的实际问题可能因为他们的数 学复杂性而并没有解析解。EES 允许用户摆脱平凡杂事而集中更多心思于开发上。 对于需要确定一个或更多参数的设计问题,EES 显得特别有用。EES 程序提供了物性参数表,这类似于一张电子表格。用户需要确定独立变量并在表格里输入其数值,EES 将计算出表格中其他物性参数的数值。则表格内的参数的关系可以显示在平面图上。EES 也提供了实验数据误差引起计算变量误差的估计。利用 EES,设计问题并不比求解一个具有固定自变量的问题难。 EES 的优势在于它提供一套简单而直观的命令,这样初学者能迅速掌握解决任何代数学问题的方法。而且,这个软件的功能对于专业人员来说也是强大而实用的。内置于 EES 软件中的庞大的关于热物性和迁移性质的数据库对于解决关于热力学、流体力学和传热学问题 是大有裨益的。EES 可以用于很多工程问题;尤其适用于在机械工程课程方面和解决实际工程问题的需要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值