给一个数,问最少由多少 个 3*n(n-1)+1的数字构成 n*(n-1)/2是三角形数,任意一个数可以由不超过三个三角形数构成,假设有k个数 6*(A1+。。。Ak)+k=n
(n-k)%6==0 最小的k就是答案,需要特判下k=1 或2 的情况
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
const int N=1e6+10;
const int MAXN=(1<<31)-1;
int INF=0x7f7f7f7f;
int T,n,m,k,tot;
const int MOD=1e9+7;
int cas=1;
bool check1(int n){
n-=1;
if(n%3) return false;
n/=3;
int tmp=(int)sqrt(n)+1;
if(tmp*(tmp-1)!=n) return false;
return true;
}
bool check2(int n){
for(int i=1;3*i*(i-1)+1<=n;i++){
int u=3*i*(i-1)+1;
if(check1(n-u)) return true;
}
return false;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&m);
if(check1(m)) puts("1");
else if(check2(m)) puts("2");
else{
for(int i=3;i<=9;i++){
if(m-i>=0 && (m-i)%6==0){
printf("%d\n",i);
break;
}
}
}
}
return 0;
}