等差数列_1878_C. Vasilije in Cacak

#include

using namespace std;

typedef long long LL;

void solve()
{
	LL n,k,x;
	cin>>n>>k>>x;
	
	LL min_sum=(1+k)*k/2;
	LL max_sum=(n-k+1+n)*k/2;
	
	if(x>=min_sum&&x<=max_sum)
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

写出来和正解一样,果然还是要猜结论

不能傻傻去枚举计算,最好就是猜一个结论,然后去判断是否满足这个结论,一般输出YES都是这种

该题要求1-n里面的所有数字能不能刚好找到k个不同的数字,使得和刚好等于x,结论是看x是否在某个区间内,在区间内就输出YES

区间是,能构造的最小值和最大值,等差数列求和即可,就是前面k个数字的和,后面k个数字的和

求和的公式中间有两个整型数字相乘,会超过数据范围,要么计算过程中强制转换,要么开始定义时直接定义把数据类型定义成long long

这个题是div 3 C,要是不太难,第三题我应该可以写出来

你可能感兴趣的:(#,CF,900-1000,c语言,算法,开发语言)