jzxx2782小X與小和尚(sum)

題目描述
研究了這麼多學術性的問題,小 X 想聽個故事來放鬆一下自己的大腦。而小 X 最喜歡聽的是這樣一個故事: 從前有座山 , 山 裏有座廟, 廟裏有個老和尚和小和尚,老和尚給小和尚講故事: 從前有座山 , 山裏有座廟, 廟裏有個老和尚和小和尚,老和尚給小和尚講故事: 從前有座山……
不過講着講着,老和尚也有點累 了,所以這一次老和尚不給小和尚講故事了,老和尚要求小和尚去敲木魚。 這個敲木魚是有講究的,在開始敲之前老和尚會告訴小和尚一個數 n。而小和尚在敲的時候, 第一次敲 1 下, 第二次敲 2 下… 第 n 次敲 n 下, 第 n+1 次敲 n 下, 第 n+2 次敲 n-1 下… 第 2× n 次敲 1 下,第 2× n+1 次敲 1 下, 第 2× n+2 次敲 2 下……
如果用一個簡單的數列 來表示小和尚 每次敲了多少 下,那應該是: 1, 2, 3,……, n-1, n, n, n-1, n-2,……, 3, 2, 1, 1, 2, 3,……
簡單說來就是 1~n, n~1, 1~n 一直這麼循環地敲下去。
小和尚數着數着就不記得自己敲了多少下了,而他只記得自己剛剛敲完第 m 次。 馬上老和尚就要來檢查小和尚是不是在認真的敲了,小和尚沒辦法, 只 能求助於你, 希望你能告訴他, 敲完第 m 次的時候,他一共敲了多少下?
輸入
輸入數據共有一行包含兩個用空格隔開的整數表示 n 和 m。

輸出
輸出數據僅有一行包含一個正整數ans, 表示最後小和尚一共敲了 ans下。
注意運算時數據可能比較大, Pascal 選手請使用 int64, C++ 選手請使用 long long
樣例
輸入
3 8
輸出
15

提示
【數據範圍】
對於 40% 的數據, 1 ≤ m ≤ 100000
對於另外 30% 的數據, n = 2
對於 100% 的數據, 1 ≤ n ≤ 10, 1 ≤ m ≤ 1000000000

【樣例解釋】
小和尚共敲了 8 次木魚, 第一次敲了 1 下, 第二次敲了 2 下, 第三次敲了 3 下, 第四次敲了 3 下, 第
五次敲了 2 下, 第六次敲了 1 下, 第七次敲了 1 下, 第八次敲了 2 下,總共敲了 15 下。

來源/分類
常州市2016“信息與未來”夏令營選拔賽

傳送門

滿分代碼:
#include<bits/stdc++.h>
using namespace std;
long long acycle(long long m, long long n) {
	if(m <= n)
		return (1+m)*m/2;
	else
		return (1+n)*n/2 + (2*n -(m-n-1))*(m-n)/2;
}
int main() {
	long long m, n, ans;
	cin>>n>>m;
	ans = m / (2*n) *acycle(2*n,n) + acycle(m %(2*n), n);
	cout <<ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章