题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5312
10 1 2 3 4 5 6 7 8 22 10
1 2 3 4 5 6 1 2 4 4
详见代码 。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int a[100005]; bool check1(int m) { for (int i=1; i<20010; i++) { if (a[i]==m) return 1; } return 0; } bool check2(int m) { int j; for (int i=1,j=20010-1; i<20010&&a[i]<m; i++) { while (a[i]+a[j]>m) j--; if (a[i]+a[j]==m) return 1; } return 0; } int main() { for (int i=0; i<20010; i++) { a[i]=3*i*(i-1)+1; } int t; scanf("%d",&t); while (t--) { int m; scanf("%d",&m); int flag=0; if (check1(m)) { printf ("1\n"); continue; } else if (check2(m)) { printf ("2\n"); continue; } else { for (int i=3; i<=8; i++) //循环到8的原因是因为模6的余数只有0-5六个 { if ((m-i)%6==0) { printf ("%d\n",i); flag=1; break; } } } if (flag==0) { printf ("-1\n"); } } return 0; }
原文:http://blog.csdn.net/qiqi_skystar/article/details/50237931