atcoder 164 ABC D - Multiple of 2019(當時卡了好久)同餘方程

傳送門
在這裏插入圖片描述
在這裏插入圖片描述

題意:

給你一串字符即一個大整數,要你求出有多少對pair(i,j)滿足是2019的倍數。

思路:

  1. 假設x和y同餘(2019)(餘數爲d),那麼有x=a2019+d;y=b2019+d;
  2. 因爲x和y相差2019的整數倍,所以在字符串裏找到有兩隊數同餘就好操作了。
  3. 用map,vector記錄餘數也可。

反思

  1. 以後一定要想到同餘,同餘用起來真香。

AC

#include <algorithm>
#include <cmath>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <cstdio>
#include <vector>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
typedef long long ll;
vector<ll>v(2019);
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    string s;
    cin >> s;
    v[0]=1;
    int len=s.size();
    ll ans=0;
    int cnt=1,temp=0;
    reverse(s.begin(),s.end());
    For(i,0,len-1)
    {
        temp=(temp+(s[i]-'0')*cnt)%2019;
        ans+=v[temp];
        v[temp]++;
        cnt=cnt*10%2019;//模的運算法則(乘法原理)
    }
    cout<<ans<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章