[Acm] foj 2191 : 完美的数字(数学题)

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

Problem Description

Bob是个很喜欢数字的孩子,现在他正在研究一个与数字相关的题目,我们知道一个数字的完美度是 把这个数字分解成三个整数相乘A * A * B(0< A <=B)的方法数,例如数字80可以分解成1180,2220 ,445,所以80的完美度是3;数字5只有一种分解方法115,所以完美度是1,假设数字x的完美度为d(x),现在给定a,b(a<=b),请你帮Bob求出

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)

思路来自大神 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值