HDU 5312(数学推导+技巧)
2024-08-25 20:23:36
首先说一下。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;
}
最新文章
- 使用CSS3的box-shadow实现双透明遮罩层对话框
- cocos2d-js 学习笔记 --安装调试(2)
- TODO:关于自媒体博客改名
- sysbench压力测试工具简介和使用(二)
- ado.net 实体类_数据访问类
- 表单的enctype property
- Java好文统计( 引用 )
- android开发找不到模拟器(PANIC: Could not open:)解决办法
- archlinux下wifi-menu显示连接超时
- Unity3D脚本中文系列教程(十三)
- Android 实现emoji表情的demo
- Apache Hadoop 源码阅读
- Spring BOOT PERFORMANCE
- 多线程编程 (1) -NSThread
- angular指令之complie和link不得不说的故事
- spring boot项目如何测试,如何部署
- windows的80端口被占用时的处理方法
- sublime text3插件增强侧边栏的功能文件的复制粘贴
- Spring Security(十):3. What’s New in Spring Security 4.2 (新功能)
- 1 CRM
热门文章
- 网络流24题之最长k可重区间集问题
- Codeforces 160 D. Edges in MST
- dubbo基础(初学习dubbo)
- bzoj 2038 小Z的袜子 莫队算法
- April Fools Day Contest 2016 E. Out of Controls
- wampserver3.1.0安装及配置
- mysql group by 组内排序
- Java常量定义需要注意事项及static作用(复习)
- 数论E - Biorhythms(中国剩余定理,一水)
- SQL SERVER SQLOS的任务调度--微软亚太区数据库技术支持组 官方博客