题目链接:
PREV-23 数字游戏
思路:
根据题意我们易计算出第
i
(
0
≤
i
<
T
)
i(0\leq i<T)
i(0≤i<T)次说出的数字为
[
1
+
i
n
(
i
n
+
1
)
2
]
%
k
[1+\frac{in(in+1)}{2}]\%k
[1+2in(in+1)]%k,我们的目标即让
i
i
i逐个遍历,然后求和即可;
但是略微分析可知,这个数字在计算的过程中达到
1
0
24
10^{24}
1024数量级,会爆long long
,而模运算若用于除法需要求逆元,略麻烦,因此我们采用累加方式求和;
我们记第
i
(
0
≤
i
<
T
)
i(0\leq i<T)
i(0≤i<T)次说出的数字为
f
(
i
)
f(i)
f(i),则
d
i
s
=
f
(
i
)
−
f
(
i
−
1
)
=
n
(
(
2
i
−
1
)
n
+
1
)
2
dis=f(i)-f(i-1)=\frac{n((2i-1)n+1)}{2}
dis=f(i)−f(i−1)=2n((2i−1)n+1),此式最多达到
1
0
18
10^{18}
1018数量级,因此在long long
范围之内,我们只需要维护过程中每次的
f
(
i
)
%
k
f(i)\%k
f(i)%k即可;
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
ll n, mod, t;
cin >> n >> mod >> t;
ll ans = 1, rcd = 1;
for(ll i = 1; i < t; i++) {
ll dis = n * ((2 * i - 1) * n + 1) / 2 % mod;
rcd = (rcd + dis) % mod;
ans += rcd;
}
cout << ans;
return 0;
}