FZU Problem 2191 完美的數字

2021-07-07 06:03:47 字數 1503 閱讀 6949

accept: 41 submit: 121

time limit: 1000 msec memory limit : 32768 kb

problem description

s,s表示的是從a到b的所有數字的流行度之和,即s=d(a)+d(a+1)+…+d(b)。

input

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

output

輸出乙個整數,表示從a到b的所有數字流行度之和。

sample input

1 80

sample output

107

source

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

題意:給你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)

#include 

#include

using

namespace

std;

#define ll long long int

ll f(ll n)

return sum;

}int main()

return

0;}

foj 2191 完美的數字

problem 2191 完美的數字 輸入兩個整數a,b 1 a b 10 15 輸出乙個整數,表示從a到b的所有數字流行度之和。1 80 107福州大學第十二屆程式設計競賽 題意 如題。做法 其實是多個等差數列的項數相加,因為完美數是a a b 0ss a i i i i i 1,否則ss 0 b...

FZU 2191 完美的數字

fzu 2191 input 輸入兩個整數a,b 1 a b 10 15 output 輸出乙個整數,表示從a到b的所有數字流行度之和。sample input 1 80 sample output 107 思路 對於1 n a a b n b n a a 所有滿足b a 的數字 可得出 a a b...

FZU 2191 完美的數字 數論

傳送門 題型 數論 題意 中文題,不解釋。分析 因為要求x a a b且b a,所以,如果單純計算x的方法數的話,對a列舉到10 5就可以了。對於區間 a,b 列舉 b的數k,完美度為b k a 1 k 這裡,b k k,但是 a 1 k 可能 所以應該表述成 b k max a 1 k i 1 最...