題意:
給你一串字符即一個大整數,要你求出有多少對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;
}