P2674 《瞿葩的数字游戏》T2-多边形数 题解(评分:7.3)
前言
这是我的第一篇题解,一来就写蓝题
好家伙,这还是我做出的第一道蓝题呢!
解决
先上伪代码:
cin>>ng;
for(i=1;i<=ng;i++) cin>>n[i];
for(i=1;i<=ng;i++)
{
(特判)
for(j=3;j<=n[i];j++)
{
if(n[i]是j边形数) (输出细则)
}
cout<<endl;
}
1.特判
阅读题目,我们容易发现,任何大于等于
所以只有
2.输出细则
在循环到每一个
每输出一次,
当
3. (重点)N[i] 是不是 j 边形数
大多数人都是按照表格一列一列考虑的,但我按行考虑。
我们可以发现所有第
这不就是等差数列求和公式吗!
该数列首项为
所以你们就知道第
化简成以
这个式子如果等于
就是
再次化简为以
由于
如果
如果
综上所述,我们可以在时间复杂度为
所以最后代码(已经AC)如下:
#include<bits/stdc++.h>
using namespace std;
long long ng,n[101],i,j,x,pp;
int main()
{
cin>>ng;
for(i=1;i<=ng;i++) cin>>n[i];
for(i=1;i<=ng;i++)
{
pp=0;
if(n[i]<1||n[i]==2)
{
cout<<"Poor"<<n<<endl;
continue;
}
if(n[i]==1)
{
cout<<"3 4"<<endl;
continue;
} //特判1,2,非正整数。
for(j=3;j<=n[i];j++)
{
x=(j-4+(long long)(sqrt((4-j)*(4-j)+8*(j-2)*n[i])))/2/(j-2); //根据n[i]和j计算当前项数x。
if(x*((j-2)*x-j+4)/2==n[i]) //根据x和j反推是否等于n[i],即验证n[i]是不是j边形数。
{
cout<<j<<" ";
pp++;
if(pp==2) break;
}
}
cout<<endl;
}
return 0;
}