题意
Alice有很多种日历,这些日历的不同之处在于一周的天数不一样(即日历的宽度不同),Alice想要从日历的某一天开始用记号笔连续画n
天,而她拥有宽度1
到r
的日历,且每一种都有无穷本,请问Alice可以画出几种形状?
思路
通过小规模穷举可以发现:
在宽度小于n
的日历中,在每种日历上可以涂鸦出的形状的个数都是该种日历的宽度
如:当Alice要画4
天
宽度为1
的日历所画出来的形状为列数为1
行数为n
的长方形,一种形状
宽度为2
的日历所画出来的形状有以下两种
宽度为3
的日历所画出来的形状有以下三种
当使用宽度大于等于n
的日历时,所涂鸦的形状都是行数为1
、列数为n
的长方形,
- 所以
r>=n
时,可以画出1+2+……+n-1+1
种形状,即n/2*(n-1)+1
种 - 当
r<n
时,则可以画出1+2+……+n
种形状,即(1+n)/2*n
种
输入
输入由多个测试用例组成。第一行包含单个整数t(1≤t≤1000)——测试用例的数量。接下来的t行包含测试用例的描述。
对于每个测试用例,只有一行包含两个整数n,r(1≤n≤109,1≤r≤109)。
输出
对于每个测试用例,打印一个整数-问题的答案。
my Accepted code
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#define ll long long
#define db double
#define inf INT_MAX
#define s(a, n) memset(a, n, sizeof(a))
#define rep(l, a, b) for (ll l = a; l < b; ++l)
#define per(l, a, b) for (ll l = a; l >= b; --l)
#define debug(a) cout << '#' << a << '#' << endl
using namespace std;
bool fi = true;
const unsigned long long MOD = 1e9 + 7;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) {
db n, r;
cin >> n >> r;
ll ans = 0;
if (n > r) {
ans = (1 + r) / 2.0 * r;
cout << ans << endl;
} else {
ans = n / 2.0 * (n - 1);
cout << ans + 1 << endl;
}
}
}