题目描述
国王将金币作为工资,发放给忠诚的骑士。 第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