[Algo Beat Contest 002.5 A] 题目分配 (divide)题解

题目描述

小 Z 所在的 n 人团队决定组队打一场比赛,共有 m 道题。

由于题目数量过多,小 Z 决定每道题都恰好让 1 名队员去做,而且要求所有人分配到的题目数量必须互不相同,且每个人至少分配到 1 题。定义一个分配方案的不合理度为所有人分配到的题数的最大值和最小值之差。

小 Z 想知道,对于所有分配方案,其不合理度的最大值和最小值分别是多少?如果不存在合法的分配方案,输出 -1 -1

输入格式

本题单个测试点内有多组测试数据

第一行一个正整数 T 表示数据组数。

接下来 T 行,每行两个整数 n,m,表示一组测试数据。

输出格式

共 T 行,每行两个整数,用空格分隔,分别表示不合理度的最大值和最小值。

输入输出样例

输入 #1复制

5
3 9
3 10
4 10
114 514
998244353 998244353998244353

输出 #1复制

5 2
6 3
3 3
-1 -1
499998460349172224 998244352

说明/提示

【样例解释】

对于第一组测试数据,不合理度最大的一种方案如下:把 9 道题分别给第 1,1,1,1,1,1,2,2,3 名队员做,不合理度为 6−1=5 。类似地,最小的一种方案为 1,1,2,2,2,3,3,3,3,不合理度为 4−2=2 。

对于第四组测试数据,可以证明,不存在一种合法的分配方式。

【数据范围】

测试点编号n≤m≤特殊性质
1∼22109
3∼42020
520002000
6106106
7109109A
8109109
910181018A
1010181018

特殊性质 A:保证 n 是奇数。

对于所有数据,保证:

  • 1≤T≤10。
  • 2≤n,m≤10^18。

思路

直接判断。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long t,n4,m4,lk=0;
__int128 q,w,n,m,op;
int main(){
	cin>>t;
	while(t--){
		cin>>n4>>m4;
		n=n4;
		m=m4;
		q=(1+n)*n/2;
		w=m;
		if(q>=w+1){
			cout<<"-1 -1"<<endl;
		}
		else if(n!=1){
			op=(n-1)*n/2;
			cout<<(long long)((m-op)-1)<<" ";
			__int128 tt=(m-q)%n;
			if(tt!=0){
				cout<<n4<<endl;
			}		
			else{
				cout<<n4-1<<endl;
			} 
		}
		else{
			cout<<"0 0"<<endl;
		}
	}
	return 0;
}

posted @ 2025-10-05 19:47  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源