Sum of Consecutive Integers—數論 推特點
阿新 • • 發佈:2018-12-02
題目連結: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; }