「瞿葩的数字游戏」多边形数
· 阅读需 2 分钟
好吧还是一道数学题,但是比那个门神要好多了
看图
每一列都是规定边数为列数时的各正多边形的点数
可以发现:1.每列都是一个等差数列且增量等于上一列的首项,2.每列的首项均是同一个等差数列里的前项的和
so,暴力枚举直接就能切掉了
丹斯在这之前我们要考虑两个特殊情况:
时要输出,时要输出,然后对于任意正整数都至少有一个解(看第二列)
vector< int > delta;
for( int i=0, add=1;i<=1e6;i+=add, add++ ) delta.push_back( i );//预处理每列的第一个数(正三边形)
for( ;ng;ng-- )
{
int n;
cin>>n;
if( n == 1 ) cout<<"3 4\n";
if( n == 2 ) cout<<"Poor2\n";
int tot=2;
for( int i=delta.size();i>=2 && tot;i-- )//从大到小枚举,因为我们期望找到的答案尽可能小,所以要每一个边所含有的点数最多
{
int tmp=n-delta[i];//与首项做差算的差值
if( tmp < 0 ) continue;//倒欠点数,不可能存在
if( tmp%delta[i-1] ) continue;//不存在于等差数列中,跳过
cout<<3+tmp/delta[i-1]<<" ";//求它是第几项
tot--;//多一个输出
}
cout<<"\n";
}
