`
aijuans
  • 浏览: 1567842 次
社区版块
存档分类
最新评论

HDU 4342 History repeat itself 模拟

阅读更多

来源:http://acm.hdu.edu.cn/showproblem.php?pid=4342

题意:首先让求第几个非平方数,然后求从1到该数之间的每个sqrt(i)的下取整的和。

思路:一个简单的模拟题目,但是由于数据范围大,需要用__int64。我们可以首先把平方数筛选出来,假如让求第n个非平方数的话,看n前面有多少个平方数,假设有x个,则第n个非平方数就是n+x。注意两种特殊情况,即n + x是完全平方数,则加1即可。另一种是n是完全平方数。之后求和的时候,注意到一个平方数到另一个平方数之间的数开根号下取整的结果是一样的。因此不需要一个一个循环。

代码:

#include <iostream>#include <cstdio>#include <string.h>#include <cmath>using namespace std;typedef long long LL;#define CLR(arr,val) memset(arr,val,sizeof(arr))LL N = 3000000000;const int M = 1000010;LL squre[M];void init(){	CLR(squre,0);	int cnt = 0;	for(long long i = 1;;++i){	  if(i * i > N)		  break;	  //printf("ss");	  squre[cnt++] = i * i;	}	//for(int i = 0;i < 10; ++i)	//	printf("%d ",squre[i]);	//printf("\n");}int find(int x){	int ans = 0;	for(int i = 0;;++i){		if(squre[i] <= x && squre[i+1] > x){		  ans = i;		  break;		}	}	return ans + 1;}int min(int a,int b){	return a<b?a:b;}int main(){	init();	int numcase;	scanf("%d",&numcase);	while(numcase--){	   __int64 n;	   scanf("%I64d",&n);	   int x = find(n);	   n = n + x;	   __int64 y = sqrt(n*1.0);	   __int64 z = n / y;	   if(y == z)		   n++;	   __int64 sum = 1;	   __int64 p = 2,q = 1;	   while(p <= n){		     __int64 s = sqrt(squre[q] + 0.5) - 1;			 __int64 mmin = min(n,squre[q] - 1);			 __int64 num = mmin - p + 1 ;			 sum += (s * num);			 p = mmin + 1;			 q++;	   }	   printf("%I64d %I64d\n",n,sum);	}	return 0;}


分享到:
评论

相关推荐

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中...1030 简单题,可用模拟过 等等。 ACM HDU 题目分类是一个非常重要的参考资源,对于编程选手来说,掌握这些分类可以帮助他们更好地理解和解决问题。

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDU1059的代码

    HDU1059的代码

    hdu1001解题报告

    hdu1001解题报告

    hdu 1574 passed sorce

    hdu 1574 passed sorce

    HDU acm-PPT课件

    模拟竞赛是提高实战能力的有效方式,通过参与在线判题平台(如HDU OJ)的练习,可以锻炼快速阅读题目、理解和解决问题的能力。同时,ACM竞赛强调团队协作,学习如何与队友有效沟通,分工合作,共同解决问题,也是...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    hdu2101解决方案

    hdu2101AC代码

    杭电ACMhdu1163

    【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...

    hdu 5007 Post Robot

    hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。

    Hdu1000—2169部分代码

    HDU是杭州电子科技大学(Hangzhou Dianzi University)举办的一个在线编程竞赛平台,全称为HDU Online Judge。ACM是国际大学生程序设计竞赛(International Collegiate Programming Contest)的缩写,是一个全球性的...

    hdu acm1166线段树

    hdu 1166线段树代码

    ACM hdu 代码大全3000例,部分代码有详细解析

    - 模拟竞赛:通过模拟真实的ACM比赛环境,提升解决实际问题的速度和准确率。 总之,"ACM HDU代码大全3000例"是一个宝贵的编程学习资源,无论你是初学者还是经验丰富的程序员,都能从中受益匪浅。通过学习和实践...

    HDU最全ac代码

    HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...

    hdu动态规划算法集锦

    根据提供的信息,我们可以总结出以下关于“hdu动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...

Global site tag (gtag.js) - Google Analytics