博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF 1133B Preparation for International Women's Day
阅读量:6327 次
发布时间:2019-06-22

本文共 1110 字,大约阅读时间需要 3 分钟。

题目链接:

题目分析

     读完题目,凡是先暴力.....(不用想,第四组数据就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
#include
#include
#include
#include
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;}

 

转载于:https://www.cnblogs.com/winter-bamboo/p/10634440.html

你可能感兴趣的文章
科技企业的幕后推手,人工智能究竟有何魔力
查看>>
详解Oracle临时表的几种用法及意义
查看>>
HTML(七)------ 表格
查看>>
如何成为一个设计师和程序员混合型人才
查看>>
unable to load selinux policy. machine is in enforcing
查看>>
2015年10月23日作业
查看>>
MySQL5.7 加强了root用户登录安全性
查看>>
CentOS 6.3_Nagios安装配置与登录
查看>>
加强型的记录集权限(数据集权限、约束表达式设置功能)实现方法界面参考...
查看>>
Linux 内存机制
查看>>
linux下定时任务
查看>>
SharePoint 2013 部署 Part 1
查看>>
DWGSee看图纸dwg文件阅读器免费下载地址
查看>>
高能天气——团队Scrum冲刺阶段-Day 1-领航
查看>>
ISI CVPR journal ranking
查看>>
free movie
查看>>
列表组
查看>>
CF 988E Divisibility by 25 思维 第十二
查看>>
Linux Shell多命令执行
查看>>
Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?
查看>>