題目描述
研究了這麼多學術性的問題,小 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;
}