LightOJ 1245 Harmonic Number (II)

通过例子10/1到10/10,发现数列的规律:10/n到10/(n-1)之间的差值形成一个循环,如10/4到10/3为3,之后每个区间只有一个元素,可以用于解决此类问题。
摘要由CSDN通过智能技术生成

这题我是找的规律,举个例子:10/1=10,10/2=5,10/3=3,10/4=2,10/5=2,10/6=1,10/7=1,10/8=1,10/9=1,10/10=1。
10/2到10/1都是1,10/3到10/2都是2,10/4到10/3都是3,当10/n到10/(n-1)的时候就开始直接循环枚举,例如10/4到10/3中间只差一个元素,则从10/3往后每个区间就只有一个元素了,对应于这里的3,5,10,也就是在1到3这个区间开始一个个枚举。

#include <cstdio>
#include <cstring>
typedef long long ll;
ll process(int n)
{
    ll pre = n;
    ll low = 2;
    ll res = 0;
    ll inc = 1;
    while(true)
    {
        ll temp = n/low;
        if(pre-temp == 1) break;
        res += (pre-temp)*inc;
        ++inc;
        ++low;
        pre = temp;
    }
    for(ll i = 1; i <= pre; ++i)
        res += n/i;
    return res;
}

int main()
{
    int t,time = 0;
    ll n;
    scanf("%d",&t);
    while(t--)
    {
        ++time;
        scanf("%lld",&n);
        ll res = process(n);
        printf("Case %d: %lld\n",time,res);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值