Halloween treats 抽屉原理

传送门:https://vjudge.net/contest/374932#problem/B

题意

  给你一个c和长为n的序列,要求在序列中选出一些元素使他们的和能整除c。

思路

  题目保证c<=n,找到一些元素那么是不是可以找相邻的元素,因为c<=n的缘故我们可以用Find a multiple这题的思路,还是抽屉原理,然后就没有然后了。

AC代码

 

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll a[maxn],sum[maxn],num[maxn];
int vis[maxn];
int n,c;
int main()
{
    while(scanf("%d%d",&c,&n)){
        if(c==0&&n==0) break;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum[i]=sum[i-1]+a[i];
            num[i]=sum[i]%c;
        }
        int l=1,r=0;
        for(int i=1;i<=n;i++){
            if(num[i]==0){
                l=1;r=i;
                break;
            }
            if(vis[num[i]]==0) vis[num[i]]=i;
            else{
                l=vis[num[i]]+1;r=i;
                break;
            }
        }
        for(int i=l;i<=r;i++)
            printf("%d ",i);
        printf("
");
    }
    return 0;
}

 

  

原文地址:https://www.cnblogs.com/qq2210446939/p/12932261.html