Johnny and Grandmaster

或许更好的阅读体验

思路

这道题就是把一组数分成两个集合,使这两个集合的对p的次方的和的差的最小值,也就是求sum1−sum2sum1 - sum2sum1−sum2得最小值, 由于结果过大我们可能需要对结果取模。那么这题得关键在于我们应该如何分配这两个集合,也就是如何得到最优的sum1−sum2sum1 - sum2sum1−sum2的值。

我们先把给定的数组从大到小排序,我们一定可以得到pa[1]=pa[2]+pa[3]+pa[4]……+pa[x]p ^ {a[1]} = p ^ {a[2]} + p ^ {a[3]} + p ^ {a[4]} …… + p ^ {a[x]}pa[1]=pa[2]+pa[3]+pa[4]……+pa[x],这一点是显然成立的。

我们先分配最大的数到集合111中,接下来我们再分配其他的数到集合222,中,直到sum1==sum2sum1 == sum2sum1==sum2,我们再重新分配一个数到集合111中,重复如此操作我们就可以的到最小值。

这题的关键就在于我们如何判断这两个集合中的数和是相等的,容易想到sum1==sum2−>sum1−sum2==0sum1 == sum2 -> sum1 - sum2 == 0sum1==sum2−>sum1−sum2==0,于是我们好像可以利用这个点来完美的实现这个算法,但是很遗憾,wa在了test7,这里可能存在一个极大的误差,当我们的刚好是模数的时候,显然这里就错了,所以我们必须选定一个方法来避免这个错误,于是就有了,双模数判定差值是否为0。

代码

#include <bits/stdc++.h>using namespace std;typedef long long ll;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 3) + (x << 1) + (c ^ 48);c = getchar();}return f * x;
}const int mod = 1e9 + 7,  MOD = 1e9 + 3;//用两个模数来判断是否为零,
const int N = 1e6 + 10;ll a[N];ll qpow(ll a, ll n, ll mod) {ll ans = 1;while(n) {if(n & 1)   ans = (ans * a) % mod;a = (a * a) % mod;n >>= 1;}return ans;
}int main() {// freopen("in.txt", "r", stdin);int t = read();while(t--) {int n = read(); ll p = read();for(int i = 1; i <= n; i++)a[i] = read();sort(a + 1, a + 1 + n, greater<ll> ());char *str = "okkkk";ll ans1 = 0, ans2 = 0;for(int i = 1; i <= n; i++) {if(!ans1 && !ans2) {//当这两个数同时为零的时候代表两个集合的差值为零。ans1 = (ans1 + qpow(p, a[i], mod)) % mod;ans2 = (ans2 + qpow(p, a[i], MOD)) % MOD;}else {ans1 = (ans1 + mod - qpow(p, a[i], mod)) % mod;ans2 = (ans2 + MOD - qpow(p, a[i], MOD)) % MOD;}}printf("%lld\n", ans1);}return 0;
}

E:Johnny and Grandmaster相关推荐

  1. CodeForces - 1362E Johnny and Grandmaster(贪心+模拟)

    题目链接:点击查看 题目大意:给出一个基数 p ,再给出 n 个指数 k ,换句话说,现在有一个长度为 n 的序列,每个元素都是 p^k[ i ] ,现在需要将这个序列分到两个集合中,使得两个集合元素 ...

  2. cf1362E. Johnny and Grandmaster,贪心+数学,一个序列划分成两部分,差最小

    题意: 给一个序列,序列里的数都是pkip^{k_i}pki​,把序列里的数划分为两个集合,使得差值最小. 题解: 首先对kik_iki​排序,从大到小排列,对于pkip^{k_i}pki​来说,如果 ...

  3. 竞赛比完,代码、模型怎么处理?Kaggle 大神:别删,这都是宝藏

    选自 | medium 作者 | Vladimir Iglovikov 转自 | 机器之心 那些被遗忘的竞赛项目代码.权重可能也是一笔宝藏. 很多人可能参加过许多比赛,做过许多项目,但比赛或项目结束之 ...

  4. Kaggle大神:竞赛代码别删,这都是宝藏

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 选自medium 作者:Vladimir Iglovikov 机器之心编译 那些被遗忘 ...

  5. LINQ学习笔记之四:查询内存对象

    附上WORD文档,从这里下载. 查询内存对象 这一章中主要介绍了使用LINQ查询内存对象的一些基本语法.在下一章将会有更高级的用法介绍.本章中的示例数据是一个简单的出版社信息.这里是数据文件.下面的图 ...

  6. CVPR 2020 Oral 汇总:论文 / 代码 / 解读(更新中)

    在2月24日,CVPR 2020 公布接收论文结果公布,从 6656 篇有效投稿中录取了 1470 篇论文,录取率约为 22%.3月13日,CVPR Oral结果公布了.有大佬已经分享了自己的工作,本 ...

  7. 说说我的ID:fxh7622

    点名来自:[url]http://wyulnnhtg.blog.51cto.com/12178/36485[/url]<?xml:namespace prefix = o ns = " ...

  8. 以太坊五周年:从涅槃中苏醒

    来源 | Unitimes 责编 | 晋兆雨 封图 | CSDN 下载自视觉中国 <以太坊协议的史前史>作者:Vitalik Buterin,翻译:喏呗尔 <以太坊5岁啦!>作 ...

  9. 区块链:信仰亦需理性

    原文:Can't we have blockchain technology without ideology? 作者介绍:J Ellis Cameron-Perry博士,美国人,曾在苏格兰求学并在中 ...

最新文章

  1. 【hdu4281状态压缩+01背包+多旅行商问题】
  2. leader选举的源码分析-FastLeaderElection.starter
  3. 2021已去,2022未来
  4. Pytorch(5)-梯度反向传播
  5. selenium 图片上传
  6. HDU-2024c语言合法标识符
  7. Android 布局管理器 之 TableLayout
  8. 《南溪的python灵隐笔记》——tqdm的学习笔记
  9. 回溯 Rust 2020:正在成为最受欢迎的编程语言
  10. xamarin之 安装工具介绍
  11. kafka 消费者组 消费者订阅不同主题_深入了解kafka系列-消费者
  12. 【PADS】用PADS画PCB
  13. python文本处理的几个库_6个高效的语言处理Python库,你用过几个?
  14. python打开sql,Python打开Microsoft SQL Server MDF文件
  15. 轻松Git与Github入门
  16. 关于solidity解析abi方法,入参和结果字节码
  17. spring cache ttl 过期
  18. 微信大转盘 【案例源码】提供
  19. Win勒索病毒害惨中国学生!微软:最新Win10很安全
  20. Microsoft edge 下载阿里云excel

热门文章

  1. 北大青鸟s2结业考试机试_重庆北大青鸟「学员心声」任何一次的考试,都是一次珍贵的蜕变...
  2. 计算机无法创建新文件夹,无法创建文件,教您无法新建文件夹怎么办
  3. 放寒假的硕博研究生将经历什么?
  4. 编程从业五年的十四条经验,句句朴实
  5. 74款app源码,值得你拥有的干货
  6. 《SAS编程与数据挖掘商业案例》学习笔记之四
  7. 加载elementor时出现问题_不锈钢管在焊接时出现问题要怎么解决?
  8. python新手入门总结_初学python的操作难点总结(新手必看篇)
  9. hadoop安装hive及配置mysql_Hadoop系列之Hive(数据仓库)安装配置
  10. python多线程队列处理_Python线程和队列使用的一点思考