1.题目描述
- 题目来源:NEU2015年2月月赛 G题
- 题目大意:给出一个自然数N,它能分解成一串连续自然数的和,如15 = 7+8 = 4+5+6 = 1+2+3+4+5 。问有多少种分法,15有四种(包含15)
2.思路
设有一种分发为:N = (f+1) + (f+2) + (f+3) + …… + (f+n) , 那么(2f+n+1)∗n2=N 解出: f = 2N−n(n+1)2n 如果f为非负整数则为一组解。
而且根据n(n+1)2<N 求出n的最大值为2N−−−√+1,所以时间复杂度:O(n−−√)
3.代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int N;
while(~scanf("%d",&N))
{
int ans = 0;
//cout<<sqrt(2*N)+1;
for(int i = 1; i<=(int)(sqrt(2*N)+1); i++)
{
long long re = 2*N - i*(i+1);
if( re>=0 && re%(2*i) == 0){
//cout<<i<<" "<<re/(2*i)<<endl;
ans++;
}
}
printf("%d\n",ans);
}
}