题目链接
题目大意:
给你一个 n ,一个 r ,涂日历,连续涂 n 天,涂日历的时候,日历一行的天数有 k 天,1<= k <= r ,k 在 1 - r 中任取,问,涂出来的形状有几种是不同的。
解题思路:
想象一下,涂日历是从左往右涂,一行涂完开始涂下一行,假如 k = 7,即一周有7天,那么 你在第一个格子中开始涂 是一种形状,在第二个格子开始涂也是一种,第三个开始是一种 ...... 到第7个开始是一种。即一周有 k 天,就会有 k 种不同的形状。但是!!!这个的前提是 连续涂的 n 天是需要 大于 k 的,也就是必须大于 r, 再通俗点就是必须拐弯,不然,k > n 后一直都是 一横遛
所以 ,当 n > r 时,结果是 r * ( r+1 ) / 2 ,即 1 到 r 的等差数列求和
那当 n<r 的时候呢,k= n-1 之前,n 都是大于 k 的,依旧是k等于多少,就有 k 种,但是当k 大于等于 n 的时候,只能是横着一行,因为如果拐弯的画就不存在相邻了,也就是只存在 1 种。
所以,当 n <= r 时,结果是 1 + (n-1) *(n-1 +1) /2 , 就是 1 + (n-1) * n / 2 , 即 1 到 n-1 的等差数列求和
代码如下:
#include<iostream>
using namespace std;
int main()
{
long long t,n,k,r;
cin>>t;
while(t--)
{
cin>>n>>r;
if(n>r)
{
cout<<r*(r+1)/2<<endl;
}
else
{
cout<<1+(n-1)*n/2<<endl;
}
}
return 0;
}