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

题目链接:

PREV-23 数字游戏

思路:

根据题意我们易计算出第 i ( 0 ≤ i < T ) i(0\leq i<T) i(0i<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(0i<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(i1)=2n((2i1)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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值