LightOJ 1278 一个固定数可以换为几个连续数之和 求这样的连续数有多少对

来源:互联网 发布:网络上的v是什么意思 编辑:程序博客网 时间:2024/04/29 15:42

题目: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;
}

原创粉丝点击