题目背景
数字王国里有一类特殊的数,它们叫做多边形数。并且国王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;
}