题解报告:hdu 2058 The sum problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2058
问题描述
给定一个序列1,2,3,...... N,你的工作是计算所有可能的子序列,其子序列的总和为M.
输入
输入包含多个测试用例。 每个情况包含两个整数N,M(1 <= N,M <= 1000000000)。输入以N = M = 0结束。
输出
对于每个测试用例,打印其总和为M的所有可能的子序列。格式显示在下面的示例中。在每个测试用例后打印一个空行。
示例输入
20 10
50 30
0 0
示例输出
[1,4]
[10,10]
[4,8]
[6,9]
[9,11]
[30,30]
解题思路:这道题要转换一下角度来思考,否则会一直WA~_~。。
不妨假设i为区间左值,j为区间元素个数(j至少为1),则区间为[i,i+j-1]。
若这个区间合法,那么由等差数列求和公式,得(i+(i+j-1))*j/2==M(1式),即(2*i+j-1)*j/2==M(2式),故得i=(2*M/j-j+1)/2,
将i,j代回2式,若1式成立则[i,i+j-1]满足条件。注意j最小为1,(区间右值大于或等于区间左值),而由2式,得(j+2*i)*j=2*M,
由题目条件得i>=1,则j*j<=2*M,即j<=(int)sqrt(2*M)。综上,遍历区间长度j即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N,M,i,j;//数学规律,等差数列
while(cin>>N>>M && (N+M)){
for(j=(int)sqrt(*M);j>;j--){
i=(*M/j-j+)/;//推导出来的公式
if(j*(*i+j-)/==M)cout<<'['<<i<<','<<i+j-<<']'<<endl;//把i,j分别代入推导出来的表达式看是否相等
}
cout<<endl;//每个测试后面空出一行
}
return ;
}
题解报告:hdu 2058 The sum problem的更多相关文章
- HDU 2058 The sum problem(枚举)
The sum problem Problem Description Given a sequence 1,2,3,......N, your job is to calculate all the ...
- hdu 2058 The sum problem(简单因式分解,,)
Problem Description Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-se ...
- HDU 2058 The sum problem
传送门 Description Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequen ...
- HDU 2058 The sum problem (数学+暴力)
题意:给定一个N和M,N表示从1到N的连续序列,让你求在1到N这个序列中连续子序列的和为M的子序列区间. 析:很明显最直接的方法就是暴力,可是不幸的是,由于N,M太大了,肯定会TLE的.所以我们就想能 ...
- HDU 2058 The sum problem 数学题
解题报告:可以说是一个纯数学题,要用到二元一次和二元二次解方程,我们假设[a,b]这个区间的所有的数的和是N,由此,我们可以得到以下公式: (b-a+1)*(a+b) / 2 = N;很显然,这是一个 ...
- HDU - 2058 The sum problem(思路题)
题目: Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the ...
- hdu 2058 The sum problem(数学题)
一个数学问题:copy了别人的博客 #include<cstdio> #include<cstdlib> #include<cmath> int main() { ...
- HDOJ 2058 The sum problem
Problem Description Given a sequence 1,2,3,--N, your job is to calculate all the possible sub-sequen ...
- HDU 2058:The sum problem(数学)
The sum problem Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- IntelliJ IDEA14.0.3+Maven+SpringMVC+Spring+Hibernate光速构建Java权限管理系统(三)
注册登录 --利用简单的编写注册登录系统来打通从前端到后台的数据传输路径. 一.建立数据库.基本表 基本环境:mysql5,7.Navicat for MySQL11.0.9企业版. 我们在本地MyS ...
- simple-todo: 一个简易的 todo 程序 - django版
今天无意间看到 simple-todo: 一个简易的 todo 程序 - web.py 中文教程 ,然后发现竟然有好多的版本 http://simple-is-better.com/news/tag ...
- Linux上设置RAID 10
RAID 10(又叫RAID 1+0或镜像条带)阵列结合了RAID 0和RAID 1两者的功能特性,从而提供了高性能.容错的磁盘输入/输出操作.在RAID 0中,读取/写入操作跨多个驱动器并路执行:在 ...
- Deepin-键盘快捷键
是不是很happy呢? 可以用键盘替代鼠标点点点了! 1.鼠标移到右下角 2.下翻找到"快捷键" 3.自定义一个 4.示例(首先编写个简单的Shell) 程序一般放在/usr/bi ...
- MySQL基础笔记(五) 视图
一.什么是视图 视图是一个虚拟表.也就是说,视图在外观和行为上都类似于表,但它不需要实际的物理存储,只保存了视图定义(查询语句). 视图由select查询所定义 -- 当创建一个视图时,实际上是在数据 ...
- Java线程池的简单使用
最近由于公司的业务需求,需要使用线程池来进行对数据进行处理,所以就简单的学习了一下线程池的东西,刚接触感觉挺难的,不过使用了就不感觉那么难了,还是蛮简单的, package com.yd.sms.jo ...
- C语言将10进制转为2进制
第一种方法: #include<stdio.h> void dectobin(int n); int main() { int x=0; scanf("%d",& ...
- LruCache & DiskLruCache
在用户界面(UI)加载一张图片时很简单,然而,如果你需要加载多张较大的图像,事情就会变得更加复杂,.在许多情况下(如与像的ListView GridView或ViewPager的组件),屏幕上的图片的 ...
- ffmpeg+libx264+facc交叉编译 实现264流录制avi文件
默认交叉编译器已经搭建好. .. . . . . .... .... 需求: 把标准的h264流保存成avi格式的实现文件,所以须要h264的解码器,avi文件容器,传输协议类型是文件.这些会体如今f ...
- 【iOS系列】- 通知NSNotification的使用
[iOS系列]- 通知NSNotification的使用 1:属性 通知属性: - (NSString *)name; // 通知的名称 - (id)object; // 通知发布者(是谁要发布通知) ...