【CodeForces 577B】Modulo Sum

时间:2022-08-25 20:43:45

题意

给你n(1 ≤ n ≤ 106)个数a1..an(0 ≤ ai ≤ 109),再给你m( 2 ≤ m ≤ 103)如果n个数的子集的和可以被m整除,则输出YES,否则NO。

分析

分两种情况:

  当n>m时,s[i]表示a[i]前缀和,s[i]%m的取值为0到m-1,由抽屉原理/鸽巢原理可知,s[i]一定有重复的,假如重复的是s[l]和s[r],那么s[r]-s[l]也就是l+1到r这些数加起来就是m 的倍数。故答案为YES。

  当n≤m时,我们用dp[i][j]==1表示前i个数可以得到对m取余为j的子集,每次读入一个a,dp[i][a%m]=1;dp[i][j]=max(dp[i-1][j],dp[i-1][(m+j-a[i]%m)%m])(j!=a%m,0≤j<m),也就是多了第i张钱能否得到对m取余为j的价格。一旦得到dp[i][0]==1,答案就是YES就不用继续算了。但是这样太浪费空间了,也开不了那么大数组,i最大为106。只要保存上一次的和这一次的就够了。

  另一种是直接推,根据之前可得到的余数推出这一轮可得到的余数。

代码

dp代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a;
int dp[][];
int main()
{
scanf("%d%d",&n,&m);
if(n>m)dp[][]=;
else
for(int i=; i<=n; i++)
{
for(int j=; j<m; j++)dp[][j]=;
scanf("%d",&a);
dp[][a%m]=; for(int j=; j<m; j++)
{
if(dp[][])break;
if(j!=a%m)
dp[][j]=max(dp[][j],dp[][(m+j-a%m)%m]);
}
for(int j=; j<m; j++)
dp[][j]=dp[][j];
}
if(dp[][]) printf("YES");
else printf("NO");
return ;
}

另一种代码

思路是mark[i]标记当前所有数余数i能否出现,t[i]记录的之前余数i能否出现。

#include<cstdio>
#include<cstring>
int n,m;
int a;
int mark[],t[];
int main()
{
scanf("%d%d",&n,&m);
if(n>m)t[]=;
else
while(n--)
{
scanf("%d",&a);
memset(mark,,sizeof(mark));
mark[a%m]=;
for(int i=; i<m; i++)
{
if(t[]) break;
if(t[i]) mark[(a%m+i)%m]=;
//如果之前可得到%m=i的价格,那现在就可得到(a%m+i)%m的价格
}
for(int i=; i<m; i++)
{
if(t[i]==) t[i]=mark[i];
//保存这一轮的。不能合并到上面一起写
}
}
if(t[]) printf("YES\n");
else printf("NO\n");
return ;
}

【CodeForces 577B】Modulo Sum的更多相关文章

  1. codeforces 577B B&period; Modulo Sum&lpar;水题&rpar;

    题目链接: B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. 【codeforces 415D】Mashmokh and ACM&lpar;普通dp&rpar;

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  3. 【codeforces 257D】Sum

    [题目链接]:http://codeforces.com/problemset/problem/257/D [题意] 给你n个数字; 这n个数字组成的数组满足: a[i-1]<=a[i]< ...

  4. 【codeforces 757C】Felicity is Coming&excl;

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. 【codeforces 766C】Mahmoud and a Message

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【codeforces 792C】Divide by Three

    [题目链接]:http://codeforces.com/contest/792/problem/C [题意] 让你删掉最少的数字使得剩下的数字%3==0 [题解] 看代码..内置题解了现在. [完整 ...

  9. 【codeforces 514E】Darth Vader and Tree

    [题目链接]:http://codeforces.com/problemset/problem/514/E [题意] 无限节点的树; 每个节点都有n个儿子节点; 且每个节点与其第i个节点的距离都是ai ...

随机推荐

  1. The prefix &quot&semi;util&quot&semi; for element &quot&semi;util&colon;list&quot&semi; is not bound&period;

    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4. ...

  2. C&num;常用错误

    解决方法: 在配置文件连接数据库设置后加 MultipleActiveResultSets=true; <add key="ConnectionString" value=& ...

  3. 杨辉三角用java实现

    代码如下: public class ErArray { public static void main(String[] args) { //杨辉三角 int[][] num = new int[1 ...

  4. bzoj 1458 网络流

    我们可以知道每行最多可以有多少个格子不用建点,设为x[i],每列同理设为y[i],那么我们连接(source,i,x[i]),(i,sink,y[i])表示我们将一个格子不建点,那么(i,j,flag ...

  5. Spring的bean标签

    Spring框架中主要有四种标签bean.alias.import.beans,其中bean标签是其他标签的基础. 一.bean标签的属性 scope:用来配置spring bean的作用域 sing ...

  6. 01day1

    最大音量 动态规划 题意:给出一个初始值和一个变化序列 c,在第 i 步可以加上或减去 c[i],求 n 步之后能达到的最大值.有一个限定值 maxlevel,在变化过程中值不能超过 maxlevel ...

  7. 服务器发布WebService返回DataTable

    初始化Datatable时,需要为Datatable命名.否则在客户端使用时,会报“datatable不能序列化...”导致表格无法从服务器端读取到. 例如: 服务器端: DataTable dt = ...

  8. c语言指针说解

    一. 指针定义 1指针的意义 2指针的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱. #include <std ...

  9. quality center的使用简介

    quality center是一个基于Web的测试管理工具,其实是伪B/S的软件,可以组织和管理应用程序测试流程的所有阶段,包括制定测试需求.计划测试.执行测试和跟踪缺陷.此外,通过Quality C ...

  10. 再看GOPATH

    原本不打算介绍GOPATH,然而,总是有初学者问一些关于GOPATH的问题,因此在这里再介绍一下GOPATH GOPATH环境变量用于指定这样一些目录:除$GOROOT之外的包含Go项目源代码和二进制 ...