1. 程式人生 > >問題 1443: [藍橋杯][歷屆試題]數字遊戲

問題 1443: [藍橋杯][歷屆試題]數字遊戲

題目描述
棟棟正在和同學們玩一個數字遊戲。

遊戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下一個數字2。再下面的一個同學要從上一個同學說的數字往下數兩個數說出來,也就是說4。下一個同學要往下數三個數,說7。依次類推。

為了使數字不至於太大,棟棟和同學們約定,當在心中數到 k-1 時,下一個數字從0開始數。例如,當k=13時,棟棟和同學們報出的前幾個數依次為:
1, 2, 4, 7, 11, 3, 9, 3, 11, 7。

遊戲進行了一會兒,棟棟想知道,到目前為止,他所有說出的數字的總和是多少。

樣例說明
棟棟說出的數依次為1, 7, 9,和為17。
資料規模和約定
1 < n,k,T < 1,000,000;

輸入
輸入的第一行包含三個整數 n,k,T,其中 n 和 k 的意義如上面所述,T 表示到目前為止棟棟一共說出的數字個數。
輸出
輸出一行,包含一個整數,表示棟棟說出所有數的和。
樣例輸入
3 13 3
樣例輸出
17

暴力 不是wa 就是超限
但找到了 一個規律 就拿 題目中找到的那幾個數 作為例子

                                      1
1    +   (1+2+3) %k = 7
7    +   (4+5+6) % k = 9

看上面規律 每次都是由上一個的數,加上累加n次的累加和數
並且累加和數

中的累加項遞增的 並且項數是相同的
所以 可以得出 累加和數 = (首項+末項)* 項數 /2

假設 next 即為首相 , n為每輪相差n個同學
(首項)next 和 (末項) (next+n-1) 如樣例 (1 —3) (4—6)
累加和 = ((next+(next+n-1))*n/2);

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    long
long int n,k,t; scanf("%lld%lld%lld",&n,&k,&t); long long int sum=1, add=1, next=1; //next每次遞增進位的首位(首項) //add代表要加的數 for (int i=0; i<t-1; i++) { add = ( (next+(next+n-1))*n/2 + add )%k; sum += add; next = next+n; } printf("%lld\n",sum); return 0; }