藍橋杯 k倍區間

2021-10-19 13:38:37 字數 1179 閱讀 7309

暴力模擬 雙迴圈肯定超時了,需要找到數字間的規律進行優化

#includeusing namespace std;

typedef long long ll;

#define maxn 100005

//sum[r] - sum[l-1]就是區間[l,r]的和。區間[l,r]的和是k的倍數即(sum[r] - sum[l-1])%k == 0 即sum[r]%k == sum[l-1]%k

int main()

; int n,k,num[maxn]=

; cin>>n>>k;

for(int i=1;i<=n;i++)

//for

(int i=1;i<=n;i++)cout<" ";

int cnt=0;

for(int i=0;i<=n;i++)

} cout<;

return 0;

}

改進: 利用結論

sum[r]%k == sum[l-1]%k

我們只需要記錄每個sum%k=x, 並記錄x的個數, 像動態規劃一樣遍歷更新就好了。

每次都按照sum[i]%k=xi的結果,cnt[xi]的個數就是以num[i]為結尾的連續序列的個數

#includeusing namespace std;

typedef long long ll;

#define maxn 100005

//sum[r] - sum[l-1]就是區間[l,r]的和。區間[l,r]的和是k的倍數即(sum[r] - sum[l-1])%k == 0 即sum[r]%k == sum[l-1]%k

int main()

; int n,k=

;//cnt[i]=

cin>>n>>k;

for(int i=1;i<=n;i++)

//for

(int i=1;i<=n;i++)cout<" ";

int ans=0,cnt[maxn]=

,smk[maxn]=

;//smk[i]= sum[i] mod k

for(int i=1;i<=n;i++)

cout<;

return 0;

}

藍橋杯 k倍區間

題目描述 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入 第一行包含兩個整數n和k.1 n,k 100000 以下n行每行包含乙個整數ai。1 ai 10...

藍橋杯 K倍區間

時間限制 2.0s 記憶體限制 256.0mb 給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入格式 第一行包含兩個整數n和k。1 n,k 100000 以...

藍橋杯 K倍區間

給定乙個長度為 n nn 的數列,a1,a2,an a 1,a 2,a n a1 a2 a n 如果其中一段連續的子串行 ai,ai 1 aj a i,a a j ai ai 1 aj 之和是 k kk 的倍數,我們就稱這個區間 i,j i,j i,j 是 k kk倍區間。你能求出數列中總共有多少個...