题解:围圈报数

FJ和他的\(n\)头奶牛围成一个圈,从奶牛贝蒂开始报数,贝蒂先报\(1\),然后贝蒂左边的奶牛凯瑞在贝蒂数字后面再数\(1\)个数字,报数字\(2\),然后凯瑞左边的下一头奶牛汤姆在凯瑞的数字后面再数\(2\)个数字,报数字\(4\);然后汤姆左边的奶牛西蒙在汤姆的数字后面再数\(3\)个数字,报数字\(7\),以此类推,后面奶牛依次报\(11,16,22\cdots\)

这样下去,数字增长很快,FJ想了一个办法,给定一个数字\(k\),当任何一头奶牛数到\(k - 1\)时,接下来从\(0\)开始重新数数,例如,当\(k = 13\)时,奶牛贝蒂和其他奶牛报的数依次为:

\(1,2,4,7,11,3,9,3,11,7\)

在某头奶牛报了数字\(11\)之后,后面一头奶牛本来应该数\(12,13,14,15,16\)\(5\)个数字,但是当数到\(12\)时后面需要从\(0\)开始数数,所以这头奶牛真正数的数是:\(12,0,1,2,3\)\(5\)个数字,最后报数字\(3\)

在报数游戏进行了一段时间之后,贝蒂总共报了\(t\)个数,现在请你帮忙算一下,贝蒂所报的所有数字之和是多少?

输入描述

输入仅一行包含\(3\)个数\(n,k,t\)\(n\)表示奶牛个数,\(k\)表示FJ给定的数字,\(t\)表示贝蒂总共报数次数。

输出描述

输出一行一个整数,表示贝蒂所报的所有数之和。

用例输入 1

\(3\ 13\ 3\)

用例输出 1

\(17\)

用例输入 2

\(15\ 202\ 17\)

用例输出 2

\(1475\)

提示

样例1说明:

贝蒂报了\(3\)次数,数字依次为\(1, 7, 9\),和为\(17\)

数据规模和约定

  • 对于\(20\%\)的数据  \(1 < n,k,t < 100\)
  • 对于\(50\%\)的数据  \(1 < n,k,t < 10000\)
  • 对于\(100\%\)的数据  \(1 < n,k,t < 1,000,000\)
#include <bits/stdc++.h>
using namespace std;
int n,k,t;
int main() {
    cin >> n >> k >> t;
    long long sum=1,cnt=1,a=1;//sum是和,cnt是每次增加,a负责计算首项和末项
    for(int i=2; i<=t; i++) {
        cnt=((a+a+n-1)*n/2+cnt)%k;
        sum+=cnt;
        a+=n;
    }
    cout << sum;
    return 0;
}
posted @ 2025-07-10 22:26  优优的晴空  阅读(14)  评论(0)    收藏  举报