【CodeForces 577B】Modulo Sum
题意
给你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的更多相关文章
- codeforces 577B B. Modulo Sum(水题)
题目链接: B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【codeforces 257D】Sum
[题目链接]:http://codeforces.com/problemset/problem/257/D [题意] 给你n个数字; 这n个数字组成的数组满足: a[i-1]<=a[i]< ...
- 【codeforces 757C】Felicity is Coming!
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 766C】Mahmoud and a Message
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 707E】Garlands
[题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...
- 【Codeforces 429D】 Tricky Function
[题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...
- 【codeforces 792C】Divide by Three
[题目链接]:http://codeforces.com/contest/792/problem/C [题意] 让你删掉最少的数字使得剩下的数字%3==0 [题解] 看代码..内置题解了现在. [完整 ...
- 【codeforces 514E】Darth Vader and Tree
[题目链接]:http://codeforces.com/problemset/problem/514/E [题意] 无限节点的树; 每个节点都有n个儿子节点; 且每个节点与其第i个节点的距离都是ai ...
随机推荐
- Android中Adapter之BaseAdapter使用
Android界面中有时候需要显示稍微复杂的界面时,就需要我们自定义一个adapter,而此adapter就要继承BaseAdapter,重新其中的方法. Android中Adapte ...
- SSM ( Spring 、 SpringMVC 和 Mybatis )配置详解
使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没 ...
- Spring 一二事(5) - 依赖注入
<!-- 依赖注入的装配过程 --> <bean id="person" class="com.lee.spring007.di.xml.setter. ...
- [推荐]看图/图片管理软件XnViewMP
软件授权:免费 (希望你可以支持开发者) 软件官网:http://www.xnview.com/en/xnviewmp/ 软件简介: XnView MP 是一款非常著名的免费看图软件XnView 的新 ...
- Fitnesse初体验
FitNesse是一套软件开发协作工具 FitNesse是帮助大家加强软件开发过程中的协作的工具.能够让客户.测试人员和开发人员了解软件要做成什么样,帮助建议软件最终是否达到了设计初衷. 什么是Fit ...
- c# 扩展方法奇思妙用
# 扩展方法出来已久,介绍扩展方法的文章也很多,但都是笼统的.本人最近一直在思考扩展方法的应用,也悟出了一些,准备将这最近一段时间对扩展方法的思考,写成一个系列文章.每个文章只介绍一个应用方面,篇幅不 ...
- mysqli预处理和事务处理
1 应用环境 mysqli预处理功能(大量数据处理时使用) 2 步骤 a)mysqli连接数据库 $mysqli = new mysqli('localhost','root','root','chu ...
- poj 3352
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11215 Accepted: 5575 De ...
- Android应用开发中如何使用隐藏API(转)
一开始需要说明的是,Google之所以要将一些API隐藏(指加上@hide标记的public类.方法或常量)是有原因的.其中很大的原因就是Android系统本身还在不断的进化发展中.从1.0.1.1到 ...
- 加密方式&数字签名
1,对称加密 2,混合加密 3.数字签名 4,带加密的数字签名