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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章