题目
参考代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
// const int maxn = 1e6 + 5;
ll n, k, t;
ll ans, add = 1, tmp = 1;
//ans是最后的答案,add是每次栋栋的加数,tmp是栋栋每次所报的数
int main(void) {
cin >> n >> k >> t;
ans = 1;
for (int i = 0; i < t - 1; i++) {
tmp = ((add + (add + n - 1)) * n / 2 + tmp) % k;
ans += tmp;
add += n;
}
cout << ans;
return 0;
}
解题思路
借助题干给出的样例来理解
报出的数: 1, 2, 4, 7, 11, 3, 9, 3, 11, 7
每个数报出每个数时的加数: +0, +1, +2,+3, +4, +5…
此题用循环来依次计算每个同学报出的数字的话,大家可以试试,大概率是会超时,因为这道题给出的数据很大。所以最简单的方法是直接计算栋栋报的每个数,计算方法其实就是二阶等差数列
先计算每次对栋栋所报的数字的加数,这个加数就是二阶等差数列对应的一阶等差数列的前n项和
所以在每次的循环中,栋栋的加数计算是(add + (add + n - 1)) * n / 2
,注意这里是先乘n再除以2,不能先除以2再乘以n,不乘以n的话,除以2可能会有余数。
那么栋栋报的数便是((add + (add + n - 1)) * n / 2 + tmp) % k
从给出的样例可以很容易看出,下一个循环加数add的变化是add+=n
注意事项
- 此题数据很大,需要使用
long long
类型