【每日一题】Namomo Spring Camp 2022 Div1 第4天题解(前缀和、抽屉原理)

视频讲解

考虑前缀和 f [ i ] = ∑ 1 i a [ i ] % n f[i] = \sum_1^ia[i] \%n f[i]=1ia[i]%n 若在计算前缀和的过程中 f [ i ] = 0 f[i] = 0 f[i]=0 那么答案就是 1到 i;
f [ i ] f[i] f[i]的取值不存在0时,那么 f [ i ] f[i] f[i]的取值范围在 1 到 n - 1; 因为有 n个数,那么根据鸽笼原理可以知道一定存在两个数 x , y x,y x,y 使得 f [ x ] = f [ y ] f[x] =f[y] f[x]=f[y],两个位置的前缀模数相同可以得到 ∑ i y a [ i ] \sum_i^ya[i] iya[i]一定是 n n n的倍数,不存在-1的情况;

在这里插入图片描述

代码参考 很棒!

鸽笼原理的应用

int n;
int a[100005];
map<int,int> p;

void print(int l,int r){
    int len = r-l+1;
    cout << len << endl;
    forr(i,l,r) cout << a[i] <<" ";
}
signed main()
{
    cin >> n;
    p[0] = -1;
    int t = 0;
    forr(i,1,n) cin >> a[i];
    for(int i = 1;i <= n;i++){
        t = (t+a[i])%n;
        if(p[t] != 0) {
            print((p[t]==-1?0:p[t])+1,i);
            break;
        }
        p[t] = i;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值