题意是给你一个数m,可以由多少个3*n*(n-1)+1组成(可重复)
题解详见:http://blog.youkuaiyun.com/u013486414/article/details/47086067
效率是O(T*sqrt(m))
贴上代码
#include<iostream>
using namespace std;
const int maxn=1e9;
int a[100012],T,i,n,m;
int sjs1(int x)
{
int i=1;
while (a[i]<x) i++;
if (x==a[i]) return 1; else return 0;
}
int sjs2(int x)//很妙的一步
{
int i,j=n;
for (i=1;i<=n;i++)
if (a[i]<x)
{
while (a[j]+a[i]>x) j--;
if (a[j]+a[i]==x) return 1;
}
return 0;
}
int main()
{
cin>>T;
for (i=1;;i++)
{
a[i]=3*i*(i-1)+1;
if (a[i]>maxn)
{
n=i; break;
}
}
for (int I=1;I<=T;I++)
{
cin>>m;
if (sjs1(m)) cout<<1<<endl;
else if (sjs2(m)) cout<<2<<endl;
else
for (i=3;i<=n;i++)
if ((m-i)%6==0)
{
cout<<i<<endl;
break;
}
}
return 0;
}