HDU 5312 Sequence (规律题)
2015-07-26 20:28
543 查看
题意:
一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成?
思路:
首先,序列第1项是1,所以任何数都能构成了。但是最少应该是多少?对式子进行变形,6*(n*(n-1)/2)+1,看到了三角形数n*(n-1)/2,那么应该是6*(任意自然数)+x=m才对,因为最多只要3个三角形数就能组成任何自然数啦。
不妨试试m%6是多少?这样试图求x可以吗?因为任意自然数最多由3个组成,如果是k个,那么应该x>=k,别忘了还有个+1的项。x-k那部分,就只能由1来搞定了。
还有个前提,m%6=0怎么办?总不能由0个组成吧?那应该起码是1,所以(m-1)%6可以保证不为0。试试看m=13,则x=(13-1)%6+1=1,这样就真的能由1个序列中的数构成吗?序是1,7,19...好像没有。。。悲剧!应该是7+1+1+1+1+1+1才是,那6个1是补上去的。同理x=2也是需要保证序列中有两个数字能组成m才行,否则要x+=6才是答案。而3及以上就不用了,为什么我也不知道。。。
AC代码
一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成?
思路:
首先,序列第1项是1,所以任何数都能构成了。但是最少应该是多少?对式子进行变形,6*(n*(n-1)/2)+1,看到了三角形数n*(n-1)/2,那么应该是6*(任意自然数)+x=m才对,因为最多只要3个三角形数就能组成任何自然数啦。
不妨试试m%6是多少?这样试图求x可以吗?因为任意自然数最多由3个组成,如果是k个,那么应该x>=k,别忘了还有个+1的项。x-k那部分,就只能由1来搞定了。
还有个前提,m%6=0怎么办?总不能由0个组成吧?那应该起码是1,所以(m-1)%6可以保证不为0。试试看m=13,则x=(13-1)%6+1=1,这样就真的能由1个序列中的数构成吗?序是1,7,19...好像没有。。。悲剧!应该是7+1+1+1+1+1+1才是,那6个1是补上去的。同理x=2也是需要保证序列中有两个数字能组成m才行,否则要x+=6才是答案。而3及以上就不用了,为什么我也不知道。。。
#include <bits/stdc++.h> #define LL long long #define pii pair<int,int> #define INF 0x7f7f7f7f using namespace std; const int N=10100; unordered_map<int,int> mapp; vector<int > seq; void pre_cal() { int t=1; for(int i=1; i<20000&&t<=1000000000; i++) { t=3*i*(i-1)+1; mapp[t]=1; seq.push_back(t); } } bool cal(int m) { int q=0, p=seq.size()-1; while(q<=p) { int t=seq[q]+seq[p]; if(t==m) return 1; if(t>m) p--; else q++; } return 0; } int main() { //freopen("input.txt", "r", stdin); int t, m; pre_cal(); cin>>t; while(t--) { scanf("%d",&m); int k=(m-1)%6+1;//k是不会超过6的。但是答案可能超过6。 if(k>=3) printf("%d\n",k); else if(k==1)//特判 { if(mapp[m]) printf("1\n"); else printf("%d\n",k+=6); } else if(k==2)//特判 { if(cal(m)) printf("2\n"); else printf("%d\n",k+=6); } } return 0; }
AC代码
相关文章推荐
- Android Gradle Plugin指南(五)——Build Variants(构建变种版本)
- Number Sequence 重在找规律,48一循环
- hdu 5312 Sequence【数学推导】
- HDU 1242 Rescue 优先队列 BFS
- hdu 5306 Gorgeous Sequence(暴力线段树)(好题)
- hdoj 1005Number Sequence
- Integer Inquiry
- MiniGUI 自定义控件(一)
- 【Prism】MEF版UIComposition
- UVA 10420 List of Conquests
- Altuim designer 导入PCB,出现错误some nets were not able to be matched
- HDUOJ Number Sequence 题目1005
- HDU 1937 J - Justice League
- iOSUI篇--动画(Core Animation)总结
- Taxi Trip Time Winners' Interview: 3rd place, BlueTaxi
- 【瞎搞】 HDU 5312 Sequence
- HDU 5312 Sequence
- Android中多线程编程(三)Handler更新UI的方式
- ListBuffer、ArrayBuffer、Queue、Stack操作代码实战
- leetcode[96]:Unique Binary Search Trees