1. 程式人生 > 實用技巧 >2020杭電多校第三場補題

2020杭電多校第三場補題

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;
}