1. 程式人生 > >洛谷 P3131 子共七

洛谷 P3131 子共七

math 統計 位置 algo amp 答案 esp ring i++

看到這一題第一印象就是暴力好打,$O(n^2)$,預計得分$70$分

這明顯滿足不了啊,我們要用到前綴和。

$sum[i]$記錄到i的前綴和,區間$[a,b]$的和就是$sum[b]-sum[a-1]$.

處理完以後怎麽統計呢,$n^2$當然不行,我們要用到一個顯然的定理。

如果 $a\equiv c(mod$ $k)$並且$b\equiv c(mod$ $k)$,那麽$|a-b|\equiv 0(mod$ $k)$

顯然兩個數的余數在相減的時候同時減去,從而只剩下$k$的倍數。

所以題目裏我們只需要考慮每個前綴和$mod$ $7$的余數,若余數相等那麽$sum[i]$ $mod$ $7=0$,所以我們只需要記錄一下每個余數第一次出現的位置和最後一次出現的位置,相減的出答案(至少出現兩次哦)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
int n,a[50010],sum[50010],ans,k,f[10];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf(
"%d",&a[i]); sum[i]=sum[i-1]+a[i]; sum[i]%=7; } for(int i=1;i<=n;i++) { if(!f[sum[i]])f[sum[i]]=i; else ans=max(ans,i-f[sum[i]]); } printf("%d",ans); }

洛谷 P3131 子共七