[Acm] foj 2191 : 完美的數字(數學題)

Problem 2191 完美的數字
Accept: 41 Submit: 121
Time Limit: 1000 mSec Memory Limit : 32768 KBios

Problem Descriptionsegmentfault

Bob是個很喜歡數字的孩子,如今他正在研究一個與數字相關的題目,咱們知道一個數字的完美度是 把這個數字分解成三個整數相乘A * A * B(0< A <=B)的方法數,例如數字80能夠分解成1180,2220 ,445,因此80的完美度是3;數字5只有一種分解方法115,因此完美度是1,假設數字x的完美度爲d(x),如今給定a,b(a<=b),請你幫Bob求出spa

S,S表示的是從a到b的全部數字的流行度之和,即S=d(a)+d(a+1)+…+d(b)。設計

Inputcode

輸入兩個整數a,b(1<=a<=b<=10^15)
Outputip

輸出一個整數,表示從a到b的全部數字流行度之和。
Sample Inputget

1 80
Sample Outputit

107
Sourceio

福州大學第十二屆程序設計競賽程序設計


題意:

給你a和b(數據範圍很大,1~10^15),求a到b的數字完美度之和。
數字完美度求法以下:
若是一個數n,能拆分紅A * A * B的形式的個數,例如80能夠拆成1 * 1 * 80,2 * 2 * 20 ,4 * 4 * 5,因此80的數字完美度就是3.同理,5只能拆成1 * 1 * 5,那麼5的數字完美度就是1.

思路:

假設要求[1,80](即a=1,b=80)的數字完美度之和。
由於要拆成A * A * B的形式,咱們能夠令 80/(A*A).
隨便取一個數A,咱們看看有什麼規律。
當A=3時,t = 80/(3 * 3) = 8。
便可以獲得8種狀況 :
3 * 3 * 1 = 9,
3 * 3 * 2 = 18,
3 * 3 * 3 = 27,
3 * 3 * 4 = 36,
3 * 3 * 5 = 45,
3 * 3 * 6 = 54,
3 * 3 * 7 = 63,
3 * 3 * 8 = 72
這些狀況的值在80範圍內,他們是A=3時,B的全部可能的狀況。
又因爲A<=B,因此排除
3 * 3 * 1 ,
3 * 3 * 2 ,
即 B=1,2 的狀況。
那麼剩下6種狀況(t-A+1=8-3+1=6)

接下來遍歷全部的A(1-80),計算 n/(A * A)-A+1 ,不斷累加。
遍歷到後面的時候會出現 該值 <0的狀況,這時累加結束。
總結出公式就是:
f(n) = sigma(n/(A * A)-A+1 | A=1,n)( (A * A)-A+1<0時中止求和 )

這是[1,n]的數字完美值之和。

[a,b]的數字完美度之和就是 f(b)-f(a-1)

思路來自大神 svtter

代碼:

#include <iostream>
#include <stdio.h>

using namespace std;

#define ll long long int

ll f(ll n)
{
    ll i,sum = 0;
    for(i=1;i<=n;i++){
        ll t = n/(i*i)-i+1;
        if(t<=0) break;
        sum+=t;
    }
    return sum;
}

int main()
{
    ll a,b;
    while(scanf("%I64d%I64d",&a,&b)!=EOF){
        printf("%I64d\n",f(b)-f(a-1));
    }
    return 0;
}
相關文章
相關標籤/搜索