字首和取模 數列 紀中集訓

2021-09-25 19:04:16 字數 1311 閱讀 3650

不難想到,連續的子串行暗示我們字首和。

然而單純的字首和是o(n

2)o(n^2)

o(n2

)的,肯定跑不過。

那怎麼辦呢?

問題要求我們求區間和為k的倍數的區間個數。

顯而易見,如果兩個數模k是同乙個數,那麼他們的差模k餘0。

所以我們統計字首和為同乙個數的個數,用他們組合一下都滿足條件(不是排列 因為要大減小)c[n

][2]

=n∗(

n−1)

2c[n][2]=\frac

c[n][2

]=2n

∗(n−

1)​cnt

[0]cnt[0]

cnt[0]

要初始成1,因為餘數為0不需要減別的字首和,可以單獨。為方便起見,假設在前面已經放了乙個餘數為0的,讓它減。

#include

#include

#include

using

namespace std;

#define maxn 50005

#define maxk 1000005

#define inf 0x3f3f3f3f

#define ll long long

int n,k;

int cnt[maxk]

;ll abs

(ll x)

intmain()

while

(x<

0) x+

=k; s=

(s+x)

%k;int tmp=s;

//printf("%d\n",tmp);

cnt[tmp]++;

}for

(int i=

0;i(cnt[i]

>=2)

ans+

=1ll

*cnt[i]

*(cnt[i]-1

)/2;

printf

("%lld\n"

,ans);}

return0;

}

數列(字首和,離散化)

p1667 數列 給定乙個長度是n的數列a,我們稱乙個數列是完美的,當且僅當對於其任意連續子串行的和都是正的。現在你有乙個操作可以改變量列,選擇乙個區間 x,y 滿足ax ax 1 ay 0,1輸入格式 第一行乙個數n,以下n個數。資料規模 對於20 的資料,滿足1 n 5 對於100 的資料,滿足...

Bound Found(尺取 字首和)

題目大意 就是給n個有正有負的整數,然後給k個t,在n數列中找到連續的乙個序列使得這個序列的和的絕對值最接近t,然後輸出這個序列的和的絕對值和它的區間左右端點。思路 這是個尺取的問題,首先這是我第一道尺取題,不知道為什麼第一道就不容易找單調出序列,不知道掛題的學長怎麼想的,雖然當時講了一小下這種問題...

(紀中)2182 羊羊吃草(eat) 字首和

file io input eat.in output eat.out 時間限制 1000 ms 空間限制 131072 kb 具體限制 goto problemset 題目描述 小羊們上完課後,紛紛到草場上吃草。而羊村現在正在進行特色示範羊村檢查,領導們想看看羊村的草場。羊村的草場是連續分布的,每...