LightOJ 1278 Sum of Consecutive Integers(奇素数个数)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1278

题意:给定n,求n可以写成多少种至少两个连续正整数的和的形式。

思路:设n可以写成a,a+1,a+2……a+k-1的和(其中a>=1),即n=(a+a+k-1)*k/2。那么2a-1=2n/k-k。所以2n/k-k为奇数。设n=2^p*q,k=2^t*r,可知t或者为0或者为p+1。t为0时,k为奇数,t为p+1时2n/k为奇数。因此,一个奇因子对应一个解。

 

#include <iostream>

#include <cstdio>

#define i64 long long

using namespace std;



int C,num=0;



const int MAX=10000005;

bool tag[MAX];

int prime[670000],cnt;

i64 n;



void init()

{

    int i,j;

    for(i=2;i<MAX;i++) if(!tag[i])

    {

        prime[++cnt]=i;

        for(j=i+i;j<MAX;j+=i) tag[j]=1;

    }

}







i64 cal()

{

    i64 i,t,ans=1;

    for(i=1;i<=cnt&&(i64)prime[i]*prime[i]<=n;i++) if(n%prime[i]==0)

    {

        t=0;

        while(n%prime[i]==0)

        {

            t++;

            n/=prime[i];

        }

        if(prime[i]&1) ans*=(t+1);

    }

    if(n>1&&(n&1)) ans*=2;

    return ans-1;

}



int main()

{

    init();

    for(scanf("%d",&C);C--;)

    {

        scanf("%lld",&n);

        printf("Case %d: %lld\n",++num,cal());

    }

    return 0;

}

 

  

 

你可能感兴趣的:(Integer)