题目链接:https://ac.nowcoder.com/acm/contest/94570/E

国王将大米作为工资,发放给忠诚的骑士。第一天,骑士收到一粒大米;之后两天(第二天和第三天),每天收到两粒大米;之后三天(第四、五、六天),每天收到三粒大米;之后四天(第七、八、九、十天),每天收到四粒大米……;这种工资发放模式会一直这样延续下去:当连续连续n天每天收到n粒大米后,骑士会在之后的连续n+1天里,每天收到n+1粒大米。

解析:

根据题目提示:

alt

我们只要计算出需要代入公式的 t 为多少看,以及还剩余多少天

int t = 0;
for(int i = 1;i<=n;i++)
{
    t++;
    n-=i;
}
while i < n:
    n -= i
    i = i + 1
    t = t + 1

计算得到的 n 为剩余的天数, t 为需要代入公式的值

因此,可得到代码;

#include <iostream>
using namespace std;
const int N = 1e4+10;
 
int main(){
    int n;
    cin>>n;
    int t = 0,nn = n;
    for(int i = 1;i<=nn;i++)
    {
        t++;
        nn-=i;
    }
    unsigned long long res = t * (t+1);
    res = res * (2*t+1)/6;
    res = res + (t+1)*nn;
    cout<<res;
    return 0;
}
n = input()
t = 0
nn = int(n)
i = 1
while i < nn:
    nn -= i
    i = i + 1
    t = t + 1
res = t * (t+1) * (2*t+1)/6+(t+1)*nn
print(int(res))
特别注意,使用c++时,连乘可能会超过unsigned long long的范围,导致结果错误