2020杭電多校第三場補題
阿新 • • 發佈:2020-07-28
1004 Tokitsukaze and Multiple
相鄰兩個可以進行合併,求最多能構成幾個p的倍數
一種方法,是求出某一段字首和除以p,然後用map記錄一下,如果說這個數字再次出現,那麼說明p的倍數出現了一次。
沒想到的是每次都要重新清空一下map,這樣才能做到不重複。一段一段地字首和。但首先要注意一下,mp[0] = 1,這樣就能正確求出p的倍數了
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> #include <map> #include <set> #include <cmath> #include <algorithm> #include <ctime> #define ll long long #define STOPSYNC ios::sync_with_stdio(false);cin.tie(nullptr) #define MULTIKASE int Kase=0;cin>>Kase;for(int kase=1;kase<=Kase;kase++) using namespace std; void solve(){ int n, p; cin >> n >> p; std::map<int, int> mp; mp[0] = 1; int ans = 0, now = 0; for(int i = 1; i <= n; i++) { int x; cin >> x; now = (now + x) % p;// now = 2 if(mp.count(now)) { ans++; now = 0; mp.clear(); mp[0] = 1; } else mp[now] = 1; } cout << ans << endl; } int main(){ STOPSYNC; MULTIKASE{ solve(); } return 0; }