[洛谷]P2674 《瞿葩的数字游戏》T2-多边形数 (#数学)

题目背景

数字王国里有一类特殊的数,它们叫做多边形数。并且国王1规定数字见的联姻只能在同为一种多边形数中进行。(请不要吐槽这个规定...)

瞿葩对这个现象十分好奇,见36和10这一对情侣在散步,便上前询问36它是什么多边形数。可是36拍拍脑门,想了想说“我也不知道啊,你去问问国王吧。”

看来国民们并不知道自己是什么多边形数啊,国王1急的发愁。国王1只知道多边形数怎么计算,但是多边形数要怎么给国民做解释呢,干脆这样解释吧:可以排成正多边形的整数都是多边形数。当然多边形数可以分为三边(角)形数、四边形数(正方形数)、五边形数、六边形数......

题目描述

[b]!!此题为规律题,请自行寻找规律,以锻炼数学归纳能力[/b]

我们拿三角形数做例子:图中的1、3、6、10就是三角形数。

任务:求出N是哪一种多边形数(假设N是K边形数),比如我们求出36是三边形数和四边形数(貌似叫做三角形数和正方形数呵)。若不是多边形数,输出 Poor+该数字。若同时是多种多边形数,输出最小的一个和第二小的一个。每个读入文件里有ng组数据。

输入格式

先是一个数ng,然后ng行,每行一个整数。

输出格式

ng行,N相应的K1和K2,若不是多边形数,输出”Poor”+该数字(中间无空格)

输入输出样例

输入 #

2
36
1000000

输出 #

3 4
4 204

说明/提示

数据:

20% K1,K2<=6

100% N<=1000000

100% ng<=100

如果同时是多种多边形数,设K1为最小的K,K2为次小的K。


思路

第1列 1    1    1    1    1

第2列 2    3    4    5    6

第3列 3    6    9   12  15

第4列 4   10  16  22  28

分别公差为:0,1,3,6

那么,对于第n列来说,第一项为n*(n+1)/2,公差为n*(n-1)/2

看那个表显然可以想到等差数列(同一列)。

#include <stdio.h>
#include <iostream>
#define ll long long int
using namespace std;
ll n,m;
void find(int x)
{
	if(x==1)
	{
		cout<<3<<' '<<4<<endl;
		return;
	}
	if(x==2)
	{
		cout<<"Poor"<<x<<endl;
	}
	bool f1(0),f2(0);
	register int i,j,k1,k2,d,first,s;
	for(i=3;i<=x;i++)//枚举n边形 
	{
		for(j=1;j<=1001;j++)//枚举第i边形的项 
		{
			d=j*(j-1)/2;//公差 
			first=j*(j+1)/2;//n多边形的第1项 
			s=first+d*(i-3);
			if(s==x)
			{
				if(f1==0)
				{
					k1=i;
					f1=1;
				}
				else if(f1==1 && f2==0)
				{
					k2=i;
					f2=1;
				}
			}
			else if(s>x)
				break;
		}
		if(f1==1&f2==1)
		{
			break;
		}
	}
	if(f1==1 && f2==0) cout<<k1<<endl;
	if(f1==1 && f2==1) cout<<k1<<' '<<k2<<endl;
	if(f1==0 && f2==0) cout<<"Poor"<<x<<endl;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	register ll i,j;
	cin>>n;
	while(n--)
	{
		cin>>m;
		find(m);
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值