题意:
给你一串字符即一个大整数,要你求出有多少对pair(i,j)满足是2019的倍数。
思路:
- 假设x和y同余(2019)(余数为d),那么有x=a2019+d;y=b2019+d;
- 因为x和y相差2019的整数倍,所以在字符串里找到有两队数同余就好操作了。
- 用map,vector记录余数也可。
反思
- 以后一定要想到同余,同余用起来真香。
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;
}