ZOJ 2016 3935

ZOJ Problem Set - 3935
2016

Time Limit: 2 Seconds      Memory Limit: 65536 KB

In mathematics, a polygonal number is a number represented as dots or pebbles arranged in the shape of a regular polygon. The dots are thought of as alphas (units). These are one type of 2-dimensional figurate numbers. The following picture shows how triangular numbers, square numbers, pentagonal numbers and hexagonal numbers represented as dots arranged in the shape of corresponding regular polygon.

Polygonal Numbers: Triangular, Square, Pentagonal and Hexagonal numbers

2016 is not only a leap year but also a triangular and hexagonal year. If you are patient enough, you can count the number of the dots in the left triangle or in the right hexagon in the following picture. The number of dots in each shape is 2016.

 

Therefore, 2016 is a triangular-hexagonal-leap year. The previous triangular-hexagonal-leap year is 1540 and the next is 2556. So living to see 2016 is very rare experience.

You task is to list the triangular-hexagonal-leap years from 2016 to 990528. 990528 is also a triangular-hexagonal-leap year.

Input

This problem has no input.

Output

Please print each triangular-hexagonal-leap year in increasing order.

For example, if you are asked to list the triangular-hexagonal-leap years from 780 to 2556, the output should be:

780
1128
1540
2016
2556
Sample Output
2016
2556
...  <-- some lines are skipped
990528

//题意:

让你找出在【2016---990528】之间的满足以下三个条件的所有的数y;

条件1、这个数是闰年;

条件2、满足组成三角形的条件:n*(n+1)/2=y;

条件3、满足组成六边形的条件:m*(2*m-1)/2=y;

通过求解上面的两个方程可以得到x3=(-1+-sqrt(1+8*y))/2;

                                                     x6=(1+=sqrt(1+8*y))/4;

由这两个公式可以推出结果

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
bool year(int y)
{
	if(y%4==0&&y%100!=0||y%400==0)
		return true;
	return false;
}
int main()
{
	for(int i=2016;i<=990528;i+=4)
	{
		if(!year(i)) continue;
		int s=sqrt(1.0+8*i);
		if(s*s!=1+8*i) continue;
		if((s-1)%2) continue;//判断能否组成三角形 
		if((s+1)%4) continue;//判断能否组成六边形 
		printf("%d\n",i); 
	}
	return 0;
}


 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值