C程式-藍橋-數字遊戲
問題描述
棟棟正在和同學們玩一個數字遊戲。
遊戲的規則是這樣的:棟棟和同學們一共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.迴圈求出每個人報的數,若遇到棟棟報的數便求和,演算法是沒有問題的,但是會超時,必須進行演算法優化;66%通過
2.其實只要棟棟報的數就行了,其他人報的數並不會影響結果,所以直接求棟棟報的數,然後求和。
#include <stdio.h>
/*
int resolve(int n,int k,int T)//思路1,66%通過
{
int s=1,i=0;
int sum=1;
for(int j=1;;j++)//死迴圈
{
s=s+j;
if(s>k)//判斷是否大於k,
{
s=s%k;//大於則只取小於K的部分
}
if(j%n==0)//統計棟棟報過幾次數
{
i++;
if(i>=T)//次數達到T則結束迴圈
break;
// printf("%d-%d\n",sum,s);
sum=sum+s;//棟棟報的數求和
}
}
printf("%d",sum);
return 0;
}
*/
int resolve_1(long long n,long long k,long T)//思路2
{
long long s=1,l=1,sum=0;
for(long long i=0;i<T;i++)
{
sum=sum+s;//棟棟報的數求和
s=s+n*(l+l+n-1)/2;//直接求棟棟報的數
l=l+n;//跳過其他人
s=s%k;//s只取小於K的部分
}
printf("%lld",sum);
return 0;
}
int main( )
{
long long n,k,T;
scanf("%lld%lld%lld",&n,&k,&T);
resolve_1(n,k,T);
return 0;
}