C语言网 题目 1443: [蓝桥杯][历届试题]数字游戏

本文详细解析了一道涉及大型数据的模运算问题,通过使用二阶等差数列的求和公式,巧妙地计算出每个同学报数的序列,并给出C++参考代码实现。解题关键在于理解数列的规律,避免直接循环导致的超时。注意计算过程中对整型溢出的处理,使用long long类型确保数值的正确性。
摘要由CSDN通过智能技术生成

题目

跳转链接

参考代码

#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

注意事项

  1. 此题数据很大,需要使用long long类型
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值