給出的題解不錯,所以不寫得太詳細了。
誰不會60分的那真是沒辦法了。
1 #include2考場上秒寫的8行60分暴力int x[405][405
],n,m,k,ans;
3int
main()
看資料範圍,有不少測試點m=2。這有什麼用?(肯定和同樣矩陣大小而mn均勻的點不一樣啦)
永遠不要忽視測試點的提示作用。noip資料範圍就很全。
對於只有兩行的矩陣,首先我們只選出單獨一行的2種,處理它。
接下來就只有兩行一起選的問題了。
擴充套件到更多行,我們可以發現所有行上的選法是m2的。
而如果把每一行的同一列上的數加起來得到新的一行,這就變成了單行上的問題了。
現在我們只需要o(n)求出單行。
剛開始我感覺不可做。但是實際上,這一行的前i位字首和為sum[i],那麼區間l~r能被k整除當且僅當(sum[r]-sum[l-1])%k==0
證明很簡單。因為這一段能整除的話,在加上其它的一段值就是後者的值。
所以我們要找滿足條件的l-1。也就是給出sum[r]問有多少sum[l-1]滿足條件。
開一堆桶buc,buc[p]表示sum[i]%k==p對應的i的個數。每次以r為區間右端點累加答案時直接加上buc[sum[r]]即可。
而且如果乙個sum值本身就是k的倍數,那麼也要ans++。
1 #include2然而也只有14行int x[405][405],n,m,mod,buc[1000005],l[405];long
long
ans;
3int
main()12}
13 printf("
%lld\n
",ans);
14 }
洛谷3941 入陣曲
標籤 模擬,字首和 題目描述 小 f 很喜歡數學,但是到了高中以後數學總是考不好。有一天,他在數學課上發起了呆 他想起了過去的一年。一年前,當他初識演算法競賽的 時候,覺得整個世界都煥然一新。這世界上怎麼會有這麼多奇妙的東西?曾經自己覺得難以解決的問題,被乙個又乙個演算法輕鬆解決。小 f 當時暗自覺...
洛谷P3941入陣曲
給你乙個的 n m 矩陣,每個格仔裡都有乙個不超過 k 的正整數。詢問這個矩陣裡有多少個不同的子矩形中的數字之和是 k 的倍數?我們先考慮乙個簡化版的一維問題 給定乙個長度為 n 的序列,a 1 a 2 cdots,a n 如果某一段子串行的和為 k 的倍數,則稱其為 k 倍區間,求該序列中有多少個...
字首和 桶 map
當我們想對字首和進行標記的時候,有for和桶兩種方法,若使用for就得巢狀,達到o n 2 的時間複雜度,在部分題目當中,很可能會超時。於是,我們便想到了用超快的桶排來進行標記,但桶排也是有侷限性的,又大又多的資料很可能使所要標記的數超過陣列的最大長度,這個時候,map便能解決這個關鍵性的問題。描述...