题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示;
因此我们可以分解出sum的素奇数因子,奇数乘以奇数=奇数,然后求满足的k的个数即可。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
typedef long long ll;
bool a[10000000];
const int maxn=1e7;
int prime[1000000],num=0;
void init()
{
for(ll i=2;i<=maxn;i++)
if(!a[i])
{
for(ll j=i*2;j<=maxn;j+=i)a[j]=1;
}
for(ll i=2;i<=maxn;i++) if(!a[i]) prime[num++]=i;
}
int main()
{
int cas=1;init();
ll sum;
int t;cin>>t;
while(t--)
{
ll ans=1;
cin>>sum;
for(int i=0;i<num&&prime[i]*prime[i]<=sum;i++)
{
ll temp=0;
if(sum%prime[i]==0)
{
while(sum%prime[i]==0)
{
sum/=prime[i];
temp++;
}
if(prime[i]%2==0) continue;
else ans=ans*(temp+1);
}
}
if(sum>1&&sum%2) ans*=2;
printf("Case %d: %lld\n",cas++,ans-1);//去掉1这个因子
}
return 0;
}