博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5312(数学推导+技巧)
阅读量:6006 次
发布时间:2019-06-20

本文共 1341 字,大约阅读时间需要 4 分钟。

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

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

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

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

#include 
#include
#include
#include
#include
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;}

转载地址:http://pasmx.baihongyu.com/

你可能感兴趣的文章
cx_Oracle install
查看>>
jquery ajax从后台获取数据
查看>>
基于Windows平台TSM 6.x版本下,如何删除初始化失败的实例。
查看>>
Start Code School Today!
查看>>
Nginx下载服务生产服务器调优
查看>>
RHEL6.5_KVM_VLAN_SET
查看>>
Windows下GCC编译环境中文乱码解决方案
查看>>
linux cut
查看>>
Linux 下JDK 安装
查看>>
DNS详解之重新认识DNS一
查看>>
VC中绘图练习(第三方库)
查看>>
MySql增加用户、授权、修改密码等语句
查看>>
xmlPullParser
查看>>
突破边缘,Know yourself!
查看>>
常见http状态码
查看>>
ldap 安装
查看>>
我的友情链接
查看>>
使用secure CRT的SFTP在LINUX与WINDOWS下交换文件
查看>>
Docker单独设置代理服务
查看>>
移动互联网,入口生死战
查看>>