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 最...