Sum of Consecutive Integers LightOJ - 1278(质因数分解转换)

题目链接

题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示;

思路:设是以x开始的一段数的和为n,且有y个数,n=(x+x+y-1)*y/2。化简为n/y-(y-1)/2=x。因为x为整数,所以(y-1)/2和n/y都为整数。所以y-1为偶数,y为奇数。所以方案的种数就是n的奇数因子的个数。

所以对于唯一分解定理,其答案就是奇数质因子的幂次+1的乘积,最后去掉1。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<map>
#include<vector>
#include<algorithm>
#define N 2000006
#define ll long long
#define ull unsigned long long 
using namespace std;
bool vis[10000010];
int prime[N];
int main()
{
    int k=0;
    for(int i=2;i<=10000000;i++)
    {
        if(!vis[i])
        {
            prime[k++]=i;
            for(int j=i+i;j<=10000000;j+=i)
                vis[j]=1;
        }
    }
    int t;
    int u=0;
    scanf("%d",&t);
    while(t--)
    {
        ll n;
        scanf("%lld",&n);
        ll ans=1;
        for(int i=0;i<k&&prime[i]*prime[i]<=n;i++)
        {
            ll sum=0;
            while(n%prime[i]==0)
            {
                n/=prime[i];
                sum++;
            }
            if(prime[i]%2==1)
            {
                ans*=(sum+1);
            }
        }
        if(n>1&&n%2)
        {
            ans*=2;
        }
        printf("Case %d: %d",++u,ans-1);
        printf("\n");
     }  
}

 

posted @ 2020-09-18 16:54  Ldler  Views(146)  Comments(0Edit  收藏  举报