zoukankan      html  css  js  c++  java
  • 题解 CF577B 【Modulo Sum】

    首先,我们发现n的范围非常大,m在1000以内。

    我们知道,n>=m时,一定有一段数字和能被m整除。

    所以,讨论n<m的情况。n在1000以内。

    背包。dp[i][j]表示前i个数中取,和除以m余数为j的。

    for(int i=1;i<=n;i++){
    	dp[i][a[i]]=1;
    	for(int j=0;j<m;j++){
    		if(dp[i-1][j]==1){
    			dp[i][j]=1;
    			dp[i][(j+a[i])%m]=1;//别写j+a[i],万一炸了呢
    		}
    	}	
    }
    

    完整的:

    #include<bits/stdc++.h>
    using namespace std;
    int a[1005];
    bool dp[1005][1005];
    int main(){
    	int n,m;
    	cin>>n>>m;
    	if(n>=m) printf("YES");
    	else{
    		for(int i=1;i<=n;i++){
    			scanf("%d",&a[i]);
    			a[i]%=m;
    		}
    		for(int i=1;i<=n;i++){
    			dp[i][a[i]]=1;
    			for(int j=0;j<m;j++){
    				if(dp[i-1][j]==1){
    					dp[i][j]=1;
    					dp[i][(j+a[i])%m]=1;
    				}
    			}	
    		}
    		if(dp[n][0]==1) printf("YES");
    		else printf("NO");
    	}
    	return 0;
    } 
    

    最后%出题人和楼下神仙!

    qaqaq
  • 相关阅读:
    几个函数小练习
    结构体和枚举类型
    结构体
    几个函数小练习
    函数简介
    网页端滚轮滑动事件
    碰撞检测
    Ajax前后台交互函数
    事件绑定与解除js
    移动端的屏幕适配问题
  • 原文地址:https://www.cnblogs.com/zdsrs060330/p/13095115.html
Copyright © 2011-2022 走看看