hdu2204Eddy's爱好

大概题意是要你输出1到n中,能够表示成a^b的数,a,b都是大于0的整数的个数,

其中b大于1。

因为1到n中,能够完全开平方的个数就是(n^0.5)的整数部分,

以此类推可以得到,完全开立方,完全开四次方各种的次数。

这样的话,要枚举的数量太大,有什么办法可以让枚举的数量减少呢?

有的,由于任意一个大于1的整数都可以表示成两个素数的乘积,

于是,能够完全开平方的个数包括了能够完全开四次方,

八次方,十六次方以此类推的个数。

于是,可以知道,只需要枚举能够完全开素数次方的个数即可。

又因为n最大不会超过10^18,由于64位整型号能够表示的最大数

大概就是9*10^18多,所以不需要特地写个大数。

又因为这样,所以素数只需要枚举到大小不超过63即可,因为

2^63-1就是64位整型的最大值,所以这个n最大,开个63次方的整数部分

结果肯定为1,为1的话就代表能够1到n中能够完全开这个次方

的数只有1个,又因为1能够开任意次方,所以,这个数肯定是1啦,

于是超过63的素数没必要枚举了,因为只有1能够开这么多次方。

对于一个数n,从小到大枚举到使n开次方为1即可,再把前面

所有开次方的结果都累加,再除去之中重复的部分,最终结果就是

题意所要求的个数。

重复的部分是说,能够完全开六次方的肯定也能够完全开二次方和三次方,

这个能完全开六次方的个数被重复加了一次,所以要减去一次,

以此类推把所有重复的部分除去即可。

还有一点,这个题目,有的人用long long读入n的时候,会wa,

这个的话,是各种编译器的原因,用cin读入就好了,

至于有的人说缺失精度什么的,只是想多了。

我的代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};
void result(long long x)
{
	int i,j,k;
	long long tmp,ans=1;
	for(i=0;;i++)
	{
		tmp=(long long)(pow(x,1.0/prime[i]));
		if(tmp<2)
			break;
		ans+=tmp-1;
		for(j=i+1;;j++)
		{
			tmp=(long long)(pow(x,1.0/(prime[i]*prime[j])));
			if(tmp<2)
				break;
			ans-=tmp-1;
			for(k=j+1;;k++)
			{
				tmp=(long long)(pow(x,1.0/(prime[i]*prime[j]*prime[k])));
				if(tmp<2)
					break;
				ans+=tmp-1;
			}
		}
	}
	printf("%lld\n",ans);
}
int main()
{
	long long x;
	while(cin>>x)
		result(x);
}

hdu2204Eddy's爱好,布布扣,bubuko.com

hdu2204Eddy's爱好

时间: 2024-08-10 10:20:55

hdu2204Eddy's爱好的相关文章

hdu2204Eddy&amp;#39;s爱好

大概题意是要你输出1到n中,可以表示成a^b的数,a,b都是大于0的整数的个数, 当中b大于1. 由于1到n中.可以全然开平方的个数就是(n^0.5)的整数部分. 以此类推能够得到,全然开立方.全然开四次方各种的次数. 这种话,要枚举的数量太大.有什么办法能够让枚举的数量降低呢? 有的,因为随意一个大于1的整数都能够表示成两个素数的乘积. 于是.可以全然开平方的个数包含了可以全然开四次方, 八次方.十六次方以此类推的个数. 于是,可以知道,仅仅须要枚举可以全然开素数次方的个数就可以. 又由于n最

hdu2204 Eddy&#39;s爱好 打表+容斥原理

Ignatius 喜欢收集蝴蝶标本和邮票,但是Eddy的爱好很特别,他对数字比较感兴趣,他曾经一度沉迷于素数,而现在他对于一些新的特殊数比较有兴趣.这些特殊数是这样的:这些数都能表示成M^K,M和K是正整数且K>1.正当他再度沉迷的时候,他发现不知道什么时候才能知道这样的数字的数量,因此他又求助于你这位聪明的程序员,请你帮他用程序解决这个问题.为了简化,问题是这样的:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K(K>1)的数. 打表+容斥原理 1 #include<stdi

容斥定理 hdu2204 Eddy&#39;s爱好

传送门:点击打开链接 很明显会有大量重复的被计算,所以很容易就想到容斥定理. 我们设dp[i]表示能表示成M^i(i>1)且i是这个数字能表示出来的最大的情况时的总类数 比如,27拆成M^K时的K最大能表示成3,所以27这个数字分在dp[3]这一类 1我们暂时不考虑,不把它放在任何一类 因为K>1,所以K至少是2,最大是2^K=N的时候,所以K最大等于log2(N),所以K非常的小 首先,求出K最大大概的位置 然后开始求dp[i].求法如下: 首先,1~N中有哪些是能拆分成M^i的,利用pow

HDU 2204 Eddy&#39;s爱好(容斥原理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2204 解题报告:输入一个n让你求出[1,n]范围内有多少个数可以表示成形如m^k的样子. 不详细说了,自己一开始也忽略了三个素数的乘积的乘方的情况. 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6

兴趣,爱好,选中值拼接

//兴趣爱好,循环取选中的值,拼接 var cks = ""; $(":checkbox:checked").each(function () { cks += $(this).val() + ","; }); cks = cks.substr(0, cks.length - 1); <div class="mb10"> 兴趣爱好: <input type="checkbox" id=&q

对玩家爱好的深渊魔王们--魔兽争霸里的Azgalor评议

对玩家爱好的深渊魔王们--魔兽争霸里的Azgalor评议Method工会早已顺利击毙了传奇地狱之火碉堡的Mannoroth,直面污染者,作为燃烧军团的副官Azgalor也就是敝人口中的"深渊'深受广大玩家嗜好.Draenor的程序还在风起云涌的举办着:地狱火城堡的FD争取战一样在赓续着.这一次.玩家将再次面临自己的老好友--恶魔军团!提及燃烧军团.不单是堕落泰坦Sargeras,还分外轻而易举想象到那些体型稍宏大的怪兽--深渊魔王,这些外形很是庞大的毁坏狂是恶魔军团的军务指导.由于气力十分强壮.

有关大学,有关爱好,有关学习,有关奋斗,有关理想:大学应该干些什么?我大学三年以来的感悟

本文由PurpleSword(jzj1993)原创,转载请注明.原文网址 http://blog.csdn.net/jzj1993 注意:本文相当长,也写了很久,改了好多遍.没时间或者看不下去的,以及即将高考的,请自觉绕行-- 〇.前言 一个人思想的进步,往往要求他能站在各种不同的角度,客观看待同一个问题(比如苏格拉底认为,人们发生争论的根本原因,是对所争论问题的背景知识,没有形成交集).而这受限于他的经历,接触过的人,经历过的事情,看过的书,了解.学习.讨论和思考过的东西等.我自认为大学接触的

HDU2204 Eddy&#39;s爱好(容斥原理)

题目问[1,n]有几个数是$m^k (k>1)$形式. 如果这样考虑,m已知k未知,对于每一个m统计其k的数量即$\lfloor log_mn \rfloor$个,再容斥,然而m太多了,完全不可行. 而k远远比m还少,应该反过来考虑,m未知k已知,对于每一个k统计其m的数量,即$\lfloor \sqrt[k]n \rfloor$个. 由于$n \leqslant 10^{18}$,而$2^{60} > 10^{18}$,所以k的范围就是小于60的整数. 然而60用容斥$2^{60}$还是不可

美发屋App-业余爱好

出于个人爱好, 自行设计了一款APP,由于时间有限,APP目前只做了3天,现大四,急求一份实习工作,月薪3K左右即可! 软件UI设计到编码,全部又我一人完成,所以工作量比较大 底部采用·FragmentTabhost ,上方自动滚动的Viewpager 和指示器,以及下拉刷新组件,等. 内容较多,涉及高级UI控件,自定义控件,美化等等.