hdu 5312 Sequence
来源:互联网 发布:windows无法识别音响 编辑:程序博客网 时间:2024/06/09 11:24
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5312
解题思路:
官方题解:
这个题看上去是一个贪心, 但是这个贪心显然是错的. 事实上这道题目很简单, 先判断1个是否可以, 然后判断2个是否可以. 之后找到最小的k(k>2), 使得(m−k)mod6=0即可.
证明如下: 3n(n−1)+1=6(n∗(n−1)/2)+1, 注意到n∗(n−1)/2是三角形数, 任意一个自然数最多只需要3个三角形数即可表示. 枚举需要k个, 那么显然m=6(k个三角形数的和)+k, 由于k≥3, 只要m−k是6的倍数就一定是有解的.
事实上, 打个表应该也能发现规律.
比赛的时候并没有发现这规律,只是将20000个数据打出来,然后再二分搜索,后来看了被别人hack的数据,才知道,有这回事。。。这怪当时太年轻,啥都不知道。。。也说明了自己打表时并没认真找规律。。。
AC代码:
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;ll a[20005];void solve(ll n){ if(n % 6 == 0){ printf("6\n"); return; } else if(n % 6 == 1){ if(*lower_bound(a+1,a+20001,n) == n) printf("1\n"); else printf("7\n"); } else if(n % 6 == 2){ int flag = 0; for(int i = 0, j = 20000; i <= 20000 && a[i] < n ; i++){ while(j > 0 && a[i] + a[j] > n) j--; if(j > 0 && a[i] + a[j] == n){ printf("2\n"); flag = 1; break; } } if(!flag) printf("8\n"); return; } else printf("%lld\n",n % 6);}int main(){ for(ll i = 1; i <= 20000; i++){ a[i] = 3 * i * (i-1) +1; } int T; scanf("%d",&T); while(T--){ ll m; scanf("%lld",&m); solve(m); } return 0;}
0 0
- HDU 5312 Sequence
- HDU 5312 Sequence
- 【瞎搞】 HDU 5312 Sequence
- hdu 5312 Sequence
- hdu 5312 Sequence
- hdu 5312 Sequence
- hdu 5312 Sequence【数学推导】
- hdu 5312 Sequence 三角形数
- hdu 5312 Sequence(数学)
- HDU 5312:Sequence 三角形数
- hdu 5312 Sequence(三角形数的利用)
- HDU 5312-Sequence(三角形数+推导)
- 【HDU 5312】Sequence(数学问题)
- hdu 1711 Number Sequence
- hdu 1711 Number Sequence
- HDU 1005 Number Sequence
- hdu 1711 Number Sequence
- HDU 3397 Sequence operation
- Thrift 基础教程(一)安装篇
- Shell脚本中$的用法
- mysq 锁机制详解
- java各种读取properties文件方法
- hadoop问题之java.net.NoRouteToHostException: 没有到主机的路由
- hdu 5312 Sequence
- HDU - 2732 Leapin' Lizards(ISAP Dinic EK)
- JAVA内省(Introspector)
- Android中收货地址管理Demo
- python常用函数
- Python学习之类
- 数据库连接池DBCP和C3P0
- 高斯平滑 高斯模糊 高斯滤波器 ( Gaussian Smoothing, Gaussian Blur, Gaussian Filter ) C++ 实现
- ios CAAnimation动画结束后会闪烁一下