题目链接:http://codeforces.com/problemset/problem/1133/B

题目分析

读完题目,凡是先暴力.....(不用想,第四组数据就TLE了,QAQ)

当两个数的和为k的倍数的时候就凑成一组,那么一定有  (a+b) % k == (a%k + b %k) % k , 而其中对于  a+b 为k的倍数的情况,有(a+b)%k ==  a%k+b%k - k  == 0, 我理解为a%k 和 b % k 分别是a,b对凑成数k的贡献。然后,你们也应该想到了,即然满足的组合a%k + b%k == 0,那么我们用数组num[]来存各个数对k取模后的值( x % k )出现的次数,然后,下标之和为k的数就是满足条件的配对,后面就简单了,统计数量就OK    。

代码区

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int Max = 2e5 + 10;
const int mod = 1e9 + 7; int num[Max]; //记录各个值(value[x])对k取模后的数的出现次数
int value[Max]; int main()
{
int n, k;;
while (scanf("%d%d", &n, &k) != EOF)
{
memset(num, 0, sizeof(num));
for (int i = 1; i <= n; i++)
{
scanf("%d", value + i);
num[value[i] % k]++; //两数相加后取模和 两数先取模后相加再取模 结果一样
}
int sum = num[0] / 2; //记录可以配对的对数
if (k % 2 == 0) //k/2的相加
{
sum += num[k / 2] / 2; //k/2的相加
}
int l = 1, r = k - 1;
while (l < r)
{
sum += min(num[l], num[r]);
l++;
r--;
}
printf("%d\n", 2 * sum); }
return 0;
}

最新文章

  1. SQL SELECT SET
  2. 【洛谷P2866】Bad Hair Day
  3. Android消息机制入门
  4. 改造dede 后台会员目录
  5. [转]win7+ubuntu 13.04双系统安装方法
  6. Burnside引理和polay计数学习小记
  7. cmd 进入不同的驱动盘及上下级目录
  8. Java类之间的关联关系(转载)
  9. 《JavaScript高级程序设计》读书笔记 ---RegExp 类型
  10. ubuntu下升级网卡驱动
  11. 201521123074 《Java程序设计》第6周学习总结
  12. Zeppelin源码
  13. 【框架学习与探究之依赖注入--Autofac】
  14. [2019.03.22] Linux 学习心得(1)
  15. Android冷启动优化
  16. MySQL 导入导出数据
  17. vs2017添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL
  18. css3属性中background-clip与background-origin的用法释疑
  19. 11.vim编辑器命令
  20. 开发一款即时通讯App,从这几步开始

热门文章

  1. python内置模块(time模块)
  2. Spring——代理实现AOP
  3. JavaWeb-SpringSecurity记住我功能
  4. npm+cnpm+vuecli3打包相关
  5. SCOI2009迷路
  6. C++入门经典-友元
  7. springboot 项目部署后 404的问题
  8. Class 源码解读
  9. CSS中盒子模型
  10. bloomberg learning