金币

题目描述

国王将金币作为工资,发放给忠诚的骑士。 第1天,骑士收到1枚金币;之后4天(第2,3,4,5天),每天收到2枚金币;之后9天(第6-14天),每天收到3枚金币;之后16天(第15-30天),每天收到4枚金币……;这种工资发放模式会一直这样延续下去:当连续N2天每天收到N枚金币后,骑士会在之后的连续(N+1)2天里,每天收到N+1枚金币。 请计算在第l到r天里,骑士一共获得了多少金币。

输入描述:

一行两个整数l,r

输出描述:

一行表示答案

示例1

输入

4 6

输出

7

说明

2+2+3=7

备注

:全部的输入数据满足: 1 ≤ l ≤ r ≤ 1010 共10个测试点。对于第i(i=1…10)个测试点,r<=10^i。

首先把[l,r]转化成[1,r]-[1,l-1]从小到大枚举金币数i,记录当前剩余天数leave当leave>=i2时,将i3加入答案,leave-=i^2;否则将leave*i加入答案,并输出答案。

#include<bits/stdc++.h>
using namespace std;
long long a[3201];
int main()
{
    long long l,r;
    scanf("%lld%lld",&l,&r);
    long long ll=0;
    long long rr=0;
    l-=1;
    int flag1=0;
    int flag2=0;
    for(int i=1;i<=3200;i++)
    {
        a[i]=1ll*i*(i+1)*(i*2+1)/6;
        if(l<=a[i]&&!flag1)
        {
            ll=i;
            flag1=1;
        }
        if(r<=a[i]&&!flag2)
        {
            rr=i;
            flag2=1;
        }
    }
    long long ans=rr*(rr+1)/2;
    ans*=ans;
    ans-=(a[rr]-r)*rr;
    long long ans1=ll*(ll+1)/2;
    ans1*=ans1;
    ans1-=(a[ll]-l)*ll;
    cout<<ans-ans1<<endl;
}

来源:nkw

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值