暴力模擬 雙迴圈肯定超時了,需要找到數字間的規律進行優化
#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倍區間。你能求出數列中總共有多少個...