XTU - 1095 连续自然数之和

又是湘潭大学的,这里贴上来的几题都是昨天湘潭大学新生赛得题目,昨天做完后发现自己智商有问题。于是今天再检验一下,发现

还是没问题的。不过中午没睡觉发现影响还是挺大的。

 

根据公式:(a1+an)*n/2 = x 所以我们很容易会枚举a1,然后往后找,如果发现比x还要大的话就枚举a1的另一个位置。

这样复杂度还是O(N^2)的。虽然到后面a1和an之间的间隔会变小,但是这题出得比较严格。我用下面O(sqrt(n))复杂度的算法,还是用了600多毫秒。

 

现在说说下面这个代码:a1n+n(n-1)d/2 = x。注意到n^2没,所以我们枚举n就可以啦。

 

#include <stdio.h> #include <math.h> int main() { int n, sum, cas = 1, p; while(scanf("%d", &n) != EOF) { int t = n << 1; printf("Case %d:/n", cas++); for(int i = sqrt(t); i > 1; i--) { if(t%i == 0) { p = t/i-i+1; if(p < 0) continue; if(!(p&1==1)) { p /= 2; if(p == 1) printf("%d %d/n", 0, p+i-1); printf("%d %d/n", p, p+i-1); } else { continue; } } } } return 0; }  

你可能感兴趣的:(XTU - 1095 连续自然数之和)