HDU 5776 Sum
Posted op-z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5776 Sum相关的知识,希望对你有一定的参考价值。
题意:问是否存在序列n的某子序列之和是m的倍数
首先求每位%m后的前缀和 【 (a+b)%k == (a%k +b%k)%k】, a[i]=(a[i]+a[i-1])%m,若出现余数为0,则子序列存在
统计每个余数出现的次数,若出现两个相同余数 即a[k] == a[i] k>i, 或n>m(抽屉原理:m个数放进m-1个抽屉 必有两个数在同一个抽屉里)则子序列i+1...k必是m的倍数
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<list> #include<set> using namespace std; typedef long long ll; typedef pair<ll,ll> p; typedef long double ld; #define mem(x) memset(x, 0, sizeof(x)) #define me(x) memset(x, -1, sizeof(x)) #define fo(i,n) for(i=0; i<n; i++) #define sc(x) scanf("%lf", &x) #define pr(x) printf("%lld ", x) #define pri(x) printf("%lld ", x) #define lowbit(x) x&-x const ll MOD = 1e18 +7; const ll N = 6e6 +5; ll a[N], vis[N]; int main() { ll i, j, k, l=0; ll n, m, t, x; cin>>t; while(t--) { cin>>n>>m; mem(vis); ll f=0; for(i=1; i<=n; i++) cin>>a[i], a[i]+=a[i-1]; if(n>m) { cout<<"YES"<<endl; continue; } for(i=1; i<=n; i++) { a[i]%=m; vis[a[i]]++; if(vis[a[i]]>1 || !a[i]) f=1; } if(f) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
以上是关于HDU 5776 Sum的主要内容,如果未能解决你的问题,请参考以下文章