商丘微网站,网站怎么加统计代码,如何创建自己的网址链接?,成都网站制作收费正题
题目链接:https://jzoj.net/senior/#main/show/3783 题目大意 nnn个数#xff0c;求这个序列中一个非空子集的和是nnn的倍数。 解题思路
可以知道一定有一种解法是一段连续的序列。 证明:设sxs_xsx表示(∑i1xai)%n(\sum_{i1}^xa_i)\%n(∑i1xai)%n#xff0c;那么…正题
题目链接:https://jzoj.net/senior/#main/show/3783 题目大意
nnn个数求这个序列中一个非空子集的和是nnn的倍数。 解题思路
可以知道一定有一种解法是一段连续的序列。 证明:设sxs_xsx表示(∑i1xai)%n(\sum_{i1}^xa_i)\%n(∑i1xai)%n那么我们要找到一个slsrs_ls_rslsr。 若有si0s_i0si0那么显然有答案 若没有sis_isi为0那么在这nnn个数中有n−1n-1n−1个可能的取值那么就必定有一个slsrs_ls_rslsr。 证毕
然后O(n)O(n)O(n)搞sis_isi就好了。 codecodecode
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N100010;
int T,n,a[N],sum,l,r,v[N*2];
int main()
{//freopen(checkin.in,r,stdin);//freopen(checkin.out,w,stdout);scanf(%d,T);while(T--){scanf(%d,n);memset(v,0,sizeof(v));sum0;l-1;r-1;for(int i1;in;i){scanf(%d,a[i]);sum(suma[i])%n;if(!sum){l0;ri;}if(v[sumn]){lv[sumn];ri;} v[sumn]i;}if(l-1){printf(-1\n);continue;}printf(%d\n,r-l);for(int il1;ir;i)printf(%d ,a[i]);putchar(\n);}
}