hdu 5312 Sequence 三角形数

这道题可以用三角形数的性质解出来,所谓三角形数就是n*(n-1)/2其中n>2。就是1,3,6,10……,也可以表示为

n*(n+1)/2。。。性质:任何一个正整数最多用三个三角形数就可以表示出来,这道题是3*n*(n-1)+1,就可以

表示为6*(n*(n-1)/2)+1,假如m需要k(k>=3)个数来表示,就相当于6*(k个三角形数的和)+k = m;所以

只要判断(m-k)%6是否等于0就可以了。需要一个或两个数的时候需要特判一下。通过这道题了解了三角形数的这个神性质

贴代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n;
int a[100005];
int solve1(int m)
{
	for(int i=1; i<n; i++)
	{
		if(a[i] == m)
			return 1;
	}
	return 0;
}
int solve2(int m)
{
	for(int i=1,j=n-1; i<n&&a[i]<m; i++)
	{
		while(a[i]+a[j] > m)
			j--;
		if(a[i]+a[j] == m)
			return 1;
	}
	return 0;
}
int main()
{
	int i,T,m;
	for(i=1; ; i++)
	{
		a[i] = 3*(i-1)*i + 1;
		if(a[i]>1000000000)
		{
			n = i;
			break;
		}

	}
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&m);
		int flag = 0;
		if(solve1(m))
			{
			  printf("1\n");
			  continue;
			}
		else if(solve2(m))
			{
				printf("2\n");
				continue;
			}
		else
		{
			for(i=3; i<=8; i++)//之所以循环到8的原因是因为模6的余数只有0-5六个,就是说i=9的情况跟i=3是一样的
			{
				if((m-i)%6 == 0)
				{
					printf("%d\n",i);
					flag = 1;
					break;
				}
			}
		}
		if(flag == 0)
			printf("-1\n");
	}
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 08:47:07

hdu 5312 Sequence 三角形数的相关文章

hdu 5312 Sequence(数学推导——三角形数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5312 Sequence Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1336    Accepted Submission(s): 410 Problem Description Today, Soda has learned a

HDU 5312 Sequence(三角形数应用)——BestCoder 1st Anniversary ($)

传送门 Sequence Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1424    Accepted Submission(s): 442 Problem Description Today, Soda has learned a sequence whose n-th (n≥1) item is 3n(n?1)+1. Now

hdu 5312 Sequence【数学推导】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5312 解法: 这个题看上去是一个贪心, 但是这个贪心显然是错的. 事实上这道题目很简单, 先判断1个是否可以, 然后判断2个是否可以. 之后找到最小的整数k (k > 2), 使得(m - k) mod 6 = 0即可. 证明如下: 3n(n-1)+1 = 6(n*(n-1)/2)+1, 注意到n*(n-1)/2是三角形数, 任意一个自然数最多只需要3个三角形数即可表示. 枚举需要k个. 事实上,

(BC 一周年) hdu 5312 Sequence

Sequence Accepts: 25 Submissions: 1442 Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) 问题描述 Soda习得了一个数列, 数列的第nn (n \ge 1)(n≥1)项是3n(n-1)+13n(n−1)+1. 现在他想知道对于一个给定的整数mm, 是否可以表示成若干项上述数列的和. 如果可以, 那么需要的最小项数是多少? 例如, 22可以表示

HDU 5312 Sequence (规律题)

题意:一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成? 思路:首先,序列第1项是1,所以任何数都能构成了.但是最少应该是多少?对式子进行变形,6*(n*(n-1)/2)+1,看到了三角形数n*(n-1)/2,那么应该是6*(任意自然数)+x=m才对,因为最多只要3个三角形数就能组成任何自然数啦. 不妨试试m%6是多少?这样试图求x可以吗?因为任意自然数最多由3个组成,如果是k个,那么应该x>=k,别忘了还有个+1的项.x-k那部分,就

hdu 5312 Sequence(数学推导+线性探查(两数相加版))

Problem Description Today, Soda has learned a sequence whose n-th (n≥1) item is 3n(n−1)+1. Now he wants to know if an integer m can be represented as the sum of some items of that sequence. If possible, what are the minimum items needed? For example,

hdu 5312 Sequence(数学思维)

题意:通式为3*i*(i-1)+1(n>=1)的数列中每个数可用若干次,求构成给定n所需的最小个数: 思路: 设构成n所需个数为x,则n=3*1*(1-1)+3*2*(2-1)+...+3*x*(x-1)+x;当时推到这一步就没有再做下去了: 然后整理得n=6*(sigma((i*(i-1)/2))+x(i*(i-1)为偶数); 也就是说n%6即为所求结果,当n%6=1,2时特判一下是否能找到满足条件的数: 二分查找:(手动二分)(STL二分) #include<cstdio> #inc

hdu 5312 三角形数 二分查找

Sequence Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 891    Accepted Submission(s): 271 Problem Description Today, Soda has learned a sequence whose n-th(n≥1) item is 3n(n?1)+1. Now he wa

HDU 5312-Sequence(三角形数+推导)

题目地址:HDU 5312 题意:Soda习得了一个数列, 数列的第nn (n \ge 1)(n≥1)项是3n(n-1)+13n(n?1)+1. 现在他想知道对于一个给定的整数mm, 是否可以表示成若干项上述数列的和. 如果可以, 那么需要的最小项数是多少?例如, 22可以表示为7+7+7+17+7+7+1, 也可以表示为19+1+1+119+1+1+1. 思路: 三角形数形如n*(n-1)/2,他们形成的数列是1,3,6,10.......,同样也可以表示成n*(n+1)/2(表示方式不同).