博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cf 319 div 2 Modulo Sum 数论+DP
阅读量:5272 次
发布时间:2019-06-14

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

                  

题目抽象:给你你一个整数数组,能否从中取出一些树,使得他们的和能被m整除。

分析:见代码注释。

1 #include 
2 #include
3 using namespace std; 4 const int MS = 1000005; 5 int n, m; 6 int cnt[MS], r[MS], tem[MS]; 7 int main() { 8 scanf("%d%d", &n, &m); 9 memset(cnt, 0, sizeof(cnt));10 for (int i = 0; i < n; i++) {11 scanf("%d", &r[i]);12 r[i] %= m;13 cnt[r[i]]++; // 统计不同余数的个数14 }15 memset(r, 0, sizeof(r)); //初始化余数i不能构成16 for (int i = 0; i < m; i++) {17 if (cnt[i] > 0) { //处理余数i18 int x = 1;19 while (cnt[i] > 0) {20 int y = x < cnt[i] ? x : cnt[i];21 cnt[i] -= y; 22 x *= 2; // 倍增算法处理。23 int z = (i * y) % m; // y个余数i构成余数z.24 for (int j = 0; j < m; j++) {25 if (r[j])26 tem[(j + z) % m] = 1; // 在余数j的基础上构成余数(j + z) %m27 }28 for (int j = 0; j < m; j++) {29 r[j] += tem[j]; // 更新能构成的余数30 tem[j] = 0;31 }32 r[z] = 1; //余数z能构成33 }34 if (r[0] > 0)35 break;36 }37 }38 if (r[0] > 0)39 printf("YES\n");40 else41 printf("NO\n");42 return 0;43 }

 

转载于:https://www.cnblogs.com/hutaishi/p/4802205.html

你可能感兴趣的文章
第一页 - 工具的使用(webstorm)
查看>>
类和结构
查看>>
CSS3选择器(二)之属性选择器
查看>>
adidas crazylight 2018 performance analysis review
查看>>
typeset shell 用法
查看>>
python 之 循环语句
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
[转]ceph网络通信模块_以monitor模块为例
查看>>
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
latex tree
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
css3学习01
查看>>
【USACO】 奶牛会展
查看>>
继承和多态
查看>>
Dijkstra+计算几何 POJ 2502 Subway
查看>>
修复IE不能执行JS的方法
查看>>
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>