藍橋杯 PREV-23 數字遊戲(等差數列)
阿新 • • 發佈:2021-02-15
藍橋杯 PREV-23 數字遊戲
試題 歷屆試題 數字遊戲
資源限制
時間限制:1.0s 記憶體限制:256.0MB
問題描述
棟棟正在和同學們玩一個數字遊戲。
遊戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下一個數字2。再下面的一個同學要從上一個同學說的數字往下數兩個數說出來,也就是說4。下一個同學要往下數三個數,說7。依次類推。
為了使數字不至於太大,棟棟和同學們約定,當在心中數到 k-1 時,下一個數字從0開始數。例如,當k=13時,棟棟和同學們報出的前幾個數依次為:
1 , 2, 4, 7, 11, 3, 9, 3, 11, 7。
遊戲進行了一會兒,棟棟想知道,到目前為止,他所有說出的數字的總和是多少。
輸入格式
輸入的第一行包含三個整數 n,k,T,其中 n 和 k 的意義如上面所述,T 表示到目前為止棟棟一共說出的數字個數。
輸出格式
輸出一行,包含一個整數,表示棟棟說出所有數的和。
樣例輸入
3 13 3
樣例輸出
17
樣例說明
棟棟說出的數依次為1, 7, 9,和為17。
資料規模和約定
1 < n,k,T < 1,000,000;
題解:由於資料規模較大,暴力列舉肯定會超時。考慮到每一圈所累加的數符合等差數列。即例子上的情況: 第一圈:1,2,3
第二圈:4,5,6
…
第n圈:1+3n,2+3n,3+3n
再由題上的限制進行取模即可。
AC程式碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int main(){
ios::sync_with_stdio(false);
int n,k,t;
cin>>n>>k>>t;
ll sum=1;
ll a1=1;
ll an=n;
int next=1;
for(int i=1;i<t; i++){
next=(next+(n*(a1+an)/2)%k)%k;
sum+=next;
a1=an+1;
an=an+n;
//cout<<next<<endl;
}
cout<<sum<<endl;
system("pause");
return 0;
}