单点时限: 2.0 sec
内存限制: 256 MB
有些正整数可以表示为 n(n>1) 个连续正整数的和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
给定一个正整数 N,判断其是否可以表示为一组连续正整数的和,输出符合条件的解的组数。
输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
第 2 T+1 行,对应每个问题有一行,每行一个正整数 N(3≤N≤1000000)。
输出格式
对每个测试数据,首先输出一行问题的编号(0 开始编号,格式:case #0: 等)。在接下来一行中输出符合条件的解的组数。
样例
input
3
15
16
99
output
case #0:
3
case #1:
0
case #2:
5
/*
思路:转化求2n的公倍数中满足(a+b)*(b-a+1)=2n
*/
#include<iostream>
using namespace std;//(a+b)*(b-a+1)/2=n
int count(int n)
{
int count=0;
for(int i = 1;i <= n; i++)// 2 4 8 16
{
//i=a+b;
//a+len-1=b
//2a+len-1=i;
//len=b-a+1
if((2*n)%i==0)
{
int len=(2*n)/i;
if((i+1-len)%2==0&&i+1-len>0)
count++;
}
}
return count;
}
int main()
{
int t;
cin>>t;
for(int i = 0; i < t; i++){
int n;
cin>>n;
printf("case #%d:\n%d\n",i,count(n));
}
return 0;
}