1. 程式人生 > >Sum of Consecutive Integers—數論 推特點

Sum of Consecutive Integers—數論 推特點

題目連結:http://lightoj.com/volume_showproblem.php?problem=1278

題意:給你一個數n(n<=10^14),然後問n能用幾個連續的數表示;

例如: 15 = 7+8 = 4+5+6 = 1+2+3+4+5,所以15對應的答案是3,有三種;

 

我們現在相當於已知等差數列的和sum = n, 另首項為a1,共有m項,那麼am = a1+m-1;

sum = m*(a1+a1+m-1)/2  -----> a1 = sum/m - (m-1)/2

a1 和 m 一定是整數,所以sum%m = 0 並且(m-1)%2=0, 所以m是sum的因子,並且要是奇數;

 

所以我們只要求n的奇數因子的個數即可,求一個數的因子個數是所有素數因子的冪+1,相乘起來就是,那麼素數只有2是偶數,

所以奇數因子的個數就是所有 素數因子(除2之外)+1的乘積,當然要m一定要大於1,所以要減去1,除去因子1的情況;

 

#include <iostream>
#include<stdio.h>
#define ll long long
using namespace std;
ll n,top,prime[1000006],ans,sum;
bool isprime[10000006];
void check()
{
    isprime[1]=1;
    for(int i=2; i<10000006; i++)
    {
        if(isprime[i]==0)
            prime[ans++]=i;
        for(int j=0; j<ans&&i*prime[j]<10000006; j++)
        {
            isprime[i*prime[j]]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}
int main()
{
    ll t;
    check();
    scanf("%lld",&t);
    while(t--)
    {
        sum=1;
        scanf("%lld",&n);
        for(ll i=0; i<ans; i++)
        {
            ll ss=1;
            if(n==1)
                break;
            while(n%prime[i]==0)
            {
                ss++;
                n/=prime[i];
            }
            if(i!=0)
                sum*=ss;
        }
        if(n>1)
            sum*=2;
        printf("Case %lld: %lld\n",++top,sum-1);
    }
    return 0;
}