链接
简单的说就是已知c,n和n个无序数字,要求这n个数中那些的和能被c整除==
联想到课件给的
#include<iostream> #include <stdlib.h> #include <algorithm> #include <stdio.h> #include<cstring> using namespace std; const int N=100009; int n,m; int a[N]; int sum[N]; int hash[N]; int main() { while(scanf("%d%d",&n,&m),n+m) { memset(hash,0,sizeof(hash)); for(int i=1;i<=m;i++) { scanf("%d",&a[i]); } int s=1,t=1; sum[0]=0; for(int i=1;i<=m;i++) { sum[i]=(sum[i-1]+a[i])%n; //cout<<i<<" "<<sum[i]<<endl; if(sum[i]==0) { t=i; break; } if(hash[sum[i]]>0) { s=hash[sum[i]]+1; t=i; break; } hash[sum[i]]=i; } for(int i=s;i<t;i++) printf("%d ",i); printf("%d\n",t); } return 0; }
#include <iostream> #include<cstdio> #include<cstring> using namespace std; bool num[1000101]; int a[1000010],c,n,sum[1000010]; int main() { // freopen("cin.txt","r",stdin); while(~scanf("%d%d",&c,&n)) { if(c==0&&n==0) break; int st=-1,ed=-1; memset(num,false,sizeof(num)); sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(ed==-1) { sum[i]=(a[i]%c+sum[i-1])%c; if(!sum[i]) {st=1;ed=i;} else if(num[sum[i]]) ed=i; num[sum[i]]=true; // printf("i=%d %d\n",i+1,sum[i]); } } for(int i=1;i<=n&&(st==-1);i++) { if(sum[i]==sum[ed]){ st=i+1; break; } } printf("%d",st); for(int i=st+1;i<=ed;i++) printf(" %d",i); printf("\n"); } return 0; }
#include <iostream> #include<cstdio> #include<cstring> using namespace std; bool num[1000101]; int a[1000010],c,n,sum[1000010]; int main() { // freopen("cin.txt","r",stdin); while(~scanf("%d%d",&c,&n)) { if(c==0&&n==0) break; int st,ed=-1; memset(num,false,sizeof(num)); sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(ed==-1) { sum[i]=(a[i]%c+sum[i-1])%c; if(num[sum[i]]) ed=i; num[sum[i]]=true; // printf("i=%d %d\n",i+1,sum[i]); } } for(int i=1;i<=n;i++) { if(sum[i]==sum[ed]){ st=i+1; break; } } printf("%d",st); for(int i=st+1;i<=ed;i++) printf(" %d",i); printf("\n"); } return 0; }