1. 程式人生 > 實用技巧 >Sum of Consecutive Integers LightOJ - 1278(質因數分解轉換)

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"); } }