蓝桥杯 PREV-23 数字游戏(等差数列)

题目链接:

PREV-23 数字游戏

思路:

根据题意我们易计算出第 i ( 0 i < T ) i(0\leq i<T) 次说出的数字为 [ 1 + i n ( i n + 1 ) 2 ] % k [1+\frac{in(in+1)}{2}]\%k ,我们的目标即让 i i 逐个遍历,然后求和即可;
但是略微分析可知,这个数字在计算的过程中达到 1 0 24 10^{24} 数量级,会爆long long,而模运算若用于除法需要求逆元,略麻烦,因此我们采用累加方式求和;
我们记第 i ( 0 i < T ) i(0\leq i<T) 次说出的数字为 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} ,此式最多达到 1 0 18 10^{18} 数量级,因此在long long范围之内,我们只需要维护过程中每次的 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;
}
发布了356 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_45228537/article/details/104448880