愚直に各テストケースについて、二重ループを回すと となってしまい、 TLE してしまいます。
そのため、各テストケースについて高速に解かないといけません。
実際に実験していくと が と になるケースには法則性があることに気づくと思います。
このように を縦軸 を横軸とし、二次元平面とみなしたとき、条件を満たす範囲は上部分の三角形になるということが分かります。
, を決めた時、どの領域を答えに該当するか、考えます。
ここで、
f(n) :=
とします。これは から までの総和です。(等差数列の公式)
の場合
上図での緑色の面積を下図のように計算することが出来ます。
答えは です。
の場合
答えは です。
よって以上の計算をすることで、各ケースを で答えることが出来ます。
よって、計算量は となり、本問題を解くことが出来ます。
def f(n):
return n*(n+1)//2
t = int(input())
for _ in range(t):
n,m = map(int,input().split())
if(n<m):
ans = f(m+1)-f(m-n)
print(ans)
else:
ans = f(m+1)
print(ans) の場合、答えを以下のように計算することもできます。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int main(){
int t;
cin >> t;
while(t--){
ll n, m;
cin >> n >> m;
n++, m++;
if(n >= m) cout << m * (m + 1) / 2 << endl;
else cout << n * m - n * (n - 1) / 2 << endl;
}
}