不難想到,連續的子串行暗示我們字首和。
然而單純的字首和是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 題目描述 小羊們上完課後,紛紛到草場上吃草。而羊村現在正在進行特色示範羊村檢查,領導們想看看羊村的草場。羊村的草場是連續分布的,每...