题解 CF1361B Johnny and Grandmaster

摘要:
目前(洛谷)最优解写法。由于每个式子都是形如\的形式,即底数相同,可以考虑变成\(p\)进制,发现对于任意\和\,满足\时,\一定被\整除。我们可以考虑记录\表示两堆的和,使任意时刻\。考虑\降序排序时贪心用较大的\(k\)补足\。\当前到\(i\),且\。否则先使\,再用剩下的\分配给\,注意满足\。

目前(洛谷)最优解写法。

首先将 \(k_i\) 降序排列,并将相同的 \(k_i\) 合并。由于每个式子都是形如 \(p^{k_i}\) 的形式,即底数相同,可以考虑变成 \(p\) 进制,发现对于任意 \(c_1,\, \ldots ,\, c_{i+1}\)\(a_0 < a_1 < a_2 \ldots < a_{i+1}\),满足 \(c_{i+1} \times p^{a_{i+1}} \ge \sum\limits_{j=1}^i c_{j} \times p_{a_j}\) 时,\(c_{i+1} \times p^{a_{i+1}} - \sum\limits_{j=1}^i c_{j} \times p_{a_j}\) 一定被 \(p^{a_0}\) 整除。

我们可以考虑记录 \(s1,\,s2\) 表示两堆的和,使任意时刻 \(s1 < s2\)
考虑 \(k_i\) 降序排序时贪心用较大的 \(k\) 补足 \(s2-s1\)\(\text{now}\) 当前到 \(i\),且 \(p^{k_i} \times \text{now} = s2 - s1\)。由于是降序排序,如果 \(\text{now} > n\) 那么后面的 \(k\) 都一定分配到 \(s1\)。否则先使 \(s1=s2\),再用剩下的 \(k_i\) 分配给 \(s1,s2\),注意满足 \(s1<s2\)

\(\text{Code}\)

def(N, int, 1e6 + 5)
def(p, int, 1e9 + 7)

int n, m;
int k[N];

int main() {
	int t; qread(t);
	W(t) {
		qread(n, m);
		rep(i, 1, n) qread(k[i]);
		sort(k + 1, k + n + 1, greater<int>());
		ll nw = 0;
		ll s1 = 0, s2 = 0;
		rep(i, 1, n) {
			if(nw && m != 1 && i != 1) {
				int nwm = k[i - 1] - k[i];
				rep(j, 1, nwm) {
					nw *= m;
					if(nw > n) {
						rep(l, i, n) s1 = (s1 + qpow(k[l], m, p)) % p;
						goto End;
					}
				}
			}
			int cn = 0, j = i;
			while(j <= n && k[i] == k[j]) ++j, ++cn;
			int ps = min(nw, (ll)cn); nw -= ps;
			if(cn > ps) {
				cn -= ps;
				int c1 = cn >> 1, c2 = cn - c1;
				if(c1 != c2) nw = 1;
				s1 = qpow(k[i], m, p) * c1 % p;
				s2 = qpow(k[i], m, p) * c2 % p;
			}
			else s1 = (s1 + qpow(k[i], m, p) * cn % p) % p;
			i = j - 1;
			// cout << s1 << ' ' << s2 << endl;
		}
		End:;
		printf("%lld\n", (s2 - s1 + p) % p);
	}
	return 0;
}

免责声明:文章转载自《题解 CF1361B Johnny and Grandmaster》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何取消Notepad++红色下划线(错误提示)vim中文件类型识别、语法高亮及缩进实现流程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

leetcode每日一题(2020-07-18):97. 交错字符串

题目描述:给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 今日学习:1.遇到字符串,多想想前缀和以及动规2.滚动数组优化:只和当前以及上一状态有关的可以进行空间优化 题解:1.我想的稍微复杂一点的dp2.官方dp3.优化dp /** * @param {string} s1 * @param {string}...

stl的stack在开发中的应用

 栈有后进先出特点,我们可以用它来暂时保存数据,在画板开发中,我用到了栈来保存用户的每一步操作,当用户点击撤销时可以把图像从栈里面取出,然后恢复。浏览器的前进和后退也是这个原理,只是它保存的是网页罢了。用stl可以轻松使用栈而不用去做复杂的函数定义,看下面的实例,希望通过下面的实例,让大家了解怎么用stl中的stack以及如何使用栈 #include &l...

Java基础之==与equal()的区别

  从刚学java起,对于==与euqal()之间的区别就一直模糊不清,搞了又搞,一直搞不明白,今天决定彻底搞懂。。。。   参考博客:http://www.cnblogs.com/pop822/p/6215040.html         http://www.jb51.net/article/73949.htm   问题分析:(1)==与equal...

蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举

蓝桥杯 枚举 奇怪的分式 标题:奇怪的分式     上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:     1/4 乘以 8/5     小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)     老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!     对于分子、分母都是 1~9 中的一位数的情况,还...

4G EPS 中建立 eNB 与 MME 之间的 S1 连接

目录 文章目录 目录 前文列表 S1 连接 eNB 的 S1 连接 UE 的 S1 连接 前文列表 《4G EPS 中的小区搜索》《4G EPS 中的 PLMN 选择》《4G EPS 中的小区选择》《4G EPS 中的随机接入》《4G EPS 中建立 UE 与 eNB 之间的 RRC 连接》 S1 连接 NOTE:这里的 S1 连接我们特指 S...

编一程序,将两个字符串连接起来,不要用strcat函数

编一程序,将两个字符串连接起来,不要用strcat函数 【答案解析】 直接将s2中的字符逐个拷贝到s1的末尾即可,用户需要保证s1中能存的下s2中的字符 获取s1末尾的位置 将s2中的字符逐个拷贝到s1中 【代码实现】 #include<stdio.h> int main() { char s1[100] = {0}; char s2...