分析
乍一看这是一道图论题啊。但是仔细看了一下发现,并没有给建图的信息,而是直接计数,那就要考虑组合数或者DP了(初赛当中基于图的计数题也不少)。
思路线比较长,关键要找到跟强连通分量的关系然后DP,但其实没法建图。
上代码
短小精悍
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll p,f[200010],c[650];
int main()
{
cin>>p;
for(int i=2;i<640;i++)
{
c[i]=c[i-1]+i-1;
}
for(int i=1;i<=p;i++)
{
f[i]=1e12;
for(int j=2;c[j]<=i;j++)
{
f[i]=min(f[i],f[i-c[j]]+j);
}
}
cout<<f[p]<<' '<<(f[p]-1)*f[p]/2-p;
return 0;
}