首先说一下。N*(N-1)/2为三角形数,随意一个自然数都最多可由三个三角形数表示。

对于,对于给定的要求值 V, 那么其一组解可表示为 V = 6*(K个三角形数的和)+K; 即随意由k个数组成的解 都有 (V-K)%6==0;

那么仅仅须要找到最小的K(1,2须要特判,结论最小值为3);

在对2进行特判时候,能够从两端到中间的线性扫描来做。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
typedef long long LL;
const int N = 100005; int n,f[N];
void init(){
for(int i=1;;i++){
int num= 3*i*(i-1)+1;
f[i]=num;
if(num>1e9){
n=i;
break;
}
}
}
int get(int v){
int p = lower_bound(f+1,f+1+n,v)-f;
return f[p]==v;
}
int find_(int v){
int l=1,r=n;
while(l<=r){
if(f[l] + f[r] < v) return 0;
while(l<=r){
if(f[l]+f[r] < v) {r++; break;}
else if(f[l]+f[r]==v) return 1;
else r--;
}
l++;
}
return 0;
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--){
int k; scanf("%d",&k);
if(get(k)) printf("1\n");
else{
int ok=0;
if((k-2)%6 == 0){
if(find_(k)) {ok=1;}
}
if(ok) printf("2\n");
else {
for(int i=3;i<=8;i++){
if((k-i)%6 == 0){
printf("%d\n",i);
break;
}
}
}
}
}
return 0;
}

最新文章

  1. 使用CSS3的box-shadow实现双透明遮罩层对话框
  2. cocos2d-js 学习笔记 --安装调试(2)
  3. TODO:关于自媒体博客改名
  4. sysbench压力测试工具简介和使用(二)
  5. ado.net 实体类_数据访问类
  6. 表单的enctype property
  7. Java好文统计( 引用 )
  8. android开发找不到模拟器(PANIC: Could not open:)解决办法
  9. archlinux下wifi-menu显示连接超时
  10. Unity3D脚本中文系列教程(十三)
  11. Android 实现emoji表情的demo
  12. Apache Hadoop 源码阅读
  13. Spring BOOT PERFORMANCE
  14. 多线程编程 (1) -NSThread
  15. angular指令之complie和link不得不说的故事
  16. spring boot项目如何测试,如何部署
  17. windows的80端口被占用时的处理方法
  18. sublime text3插件增强侧边栏的功能文件的复制粘贴
  19. Spring Security(十):3. What’s New in Spring Security 4.2 (新功能)
  20. 1 CRM

热门文章

  1. 网络流24题之最长k可重区间集问题
  2. Codeforces 160 D. Edges in MST
  3. dubbo基础(初学习dubbo)
  4. bzoj 2038 小Z的袜子 莫队算法
  5. April Fools Day Contest 2016 E. Out of Controls
  6. wampserver3.1.0安装及配置
  7. mysql group by 组内排序
  8. Java常量定义需要注意事项及static作用(复习)
  9. 数论E - Biorhythms(中国剩余定理,一水)
  10. SQL SERVER SQLOS的任务调度--微软亚太区数据库技术支持组 官方博客