题目:http://www.lightoj.com/volume_showproblem.php?problem=1278
若m能够转为连续n个整数的和,即(x+(x+n-1))*n/2=m
x = (2*m/n-n+1)/2
即2*m/n-n为奇数,当n为奇数时,其值一定为奇数,当n为偶数时,2*m/n必为奇数,令p = 2*m/n,
x = p- 2*m/p,p为奇数。即该问题求解的是m的奇因子的个数,
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
bool p[10000000];
int prime[5000000];
int count;
void makePrime()
{
for(int i = 2;i<10000000;i++)
{
if(p[i]==false)
{
if(i<=sqrt(10000000))
{
for(int j = i*i;j<10000000;j+=i)
{
p[j] = true;
}
}
prime[count++] = i;
}
}
}
int main()
{
makePrime();
int T;
long long m,ans;
scanf("%d",&T);
for(int i = 1;i<=T;i++)
{
scanf("%lld",&m);
ans = 1;
while(m%2==0)
m/=2;
for(int j = 1;j<count&&prime[j]*prime[j]<=m;j++)
{
int k=0;
if(m%prime[j]==0)
{
while(m%prime[j]==0)
{
m = m/prime[j];
k++;
}
ans *= (k+1);
}
}
if(m>1)
ans *= 2;
printf("Case %d: %lld\n",i,ans-1);
}
return 0;
}