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");
	}
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值