标签:
这道题可以用三角形数的性质解出来,所谓三角形数就是n*(n-1)/2其中n>2。就是1,3,6,10……,也可以表示为
n*(n+1)/2。。。性质:任何一个正整数最多用三个三角形数就可以表示出来,这道题是3*n*(n-1)+1,就可以
表示为6*(n*(n-1)/2)+1,假如m需要k(k>=3)个数来表示,就相当于6*(k个三角形数的和)+k = m;所以
只要判断(m-k)%6是否等于0就可以了。需要一个或两个数的时候需要特判一下。通过这道题了解了三角形数的这个神性质
贴代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> int n; int a[100005]; int solve1(int m) { for(int i=1; i<n; i++) { if(a[i] == m) return 1; } return 0; } int solve2(int m) { for(int i=1,j=n-1; i<n&&a[i]<m; i++) { while(a[i]+a[j] > m) j--; if(a[i]+a[j] == m) return 1; } return 0; } int main() { int i,T,m; for(i=1; ; i++) { a[i] = 3*(i-1)*i + 1; if(a[i]>1000000000) { n = i; break; } } scanf("%d",&T); while(T--) { scanf("%d",&m); int flag = 0; if(solve1(m)) { printf("1\n"); continue; } else if(solve2(m)) { printf("2\n"); continue; } else { for(i=3; i<=8; i++)//之所以循环到8的原因是因为模6的余数只有0-5六个,就是说i=9的情况跟i=3是一样的 { if((m-i)%6 == 0) { printf("%d\n",i); flag = 1; break; } } } if(flag == 0) printf("-1\n"); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/sinat_22659021/article/details/47081089