博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jzoj3783-[NOIP2014模拟8.19]签到题【结论题】
阅读量:2022 次
发布时间:2019-04-28

本文共 939 字,大约阅读时间需要 3 分钟。

正题

题目链接:


题目大意

n n n个数,求这个序列中一个非空子集的和是 n n n的倍数。


解题思路

可以知道一定有一种解法是一段连续的序列。

证明:设 s x s_x sx表示 ( ∑ i = 1 x a i ) % n (\sum_{i=1}^xa_i)\%n (i=1xai)%n,那么我们要找到一个 s l = s r s_l=s_r sl=sr

若有 s i = 0 s_i=0 si=0,那么显然有答案
若没有 s i s_i si为0,那么在这 n n n个数中有 n − 1 n-1 n1个可能的取值,那么就必定有一个 s l = s r s_l=s_r sl=sr

证毕

然后 O ( n ) O(n) O(n) s i s_i si就好了。


c o d e code code

#include
#include
#include
using namespace std;const int N=100010;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)); sum=0;l=-1;r=-1; for(int i=1;i<=n;i++){
scanf("%d",&a[i]); sum=(sum+a[i])%n; if(!sum){
l=0;r=i;} if(v[sum+n]){
l=v[sum+n];r=i;} v[sum+n]=i; } if(l==-1){
printf("-1\n"); continue; } printf("%d\n",r-l); for(int i=l+1;i<=r;i++) printf("%d ",a[i]); putchar('\n'); }}

转载地址:http://luwaf.baihongyu.com/

你可能感兴趣的文章
03.openssl密码实现技术
查看>>
04.openssl背景
查看>>
06.Openssl基本概念
查看>>
07.对称加密算法指令
查看>>
08.openssl非对称加密算法指令
查看>>
10.openssl证书和CA功能概述
查看>>
09.openssl信息摘要和数字签名指令
查看>>
11.openssl的标准转换指令
查看>>
socketset函数
查看>>
openssl CRL证书
查看>>
openssl 命令目录
查看>>
openssl passwd
查看>>
openssl genrsa
查看>>
openssl pkcs12
查看>>
openssl ts
查看>>
openssl srp
查看>>
openssl s_server
查看>>
openssl s_client
查看>>
openssl smime
查看>>
openssl pkcs8
查看>>