​D - Multiple of 2019​

先把串反转,用​​sum[i]​​​保存​​1~i​​所表示的数。

数字是很大的,很显然我们不能够直接保存数字,于是会想到两种办法,一个是另外想想有没有别的思路可以避免这个问题,还有另一种方法就是将得出的数字对2019进行取模,这对是否能够被2019整除是没有任何影响的。

如果不能想到别的办法,那就想想还能不能够优化已有的思路。

// Created by CAD on 2020/4/26.
#include <bits/stdc++.h>

#define ll long long
using namespace std;

const int maxn=2e5+5;
ll sum[maxn];
const int mod=2019;
ll qpow(ll x,ll n){
ll ans=1;
while(n>0){
if(n&1) ans=ans*x%mod;
n>>=1,x=x*x%mod;
}
return ans;
}
map<ll,ll> cnt;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
string s;cin>>s;
int n=s.length();
for(int i=0;i<n;++i)
sum[i+1]=s[i]-'0';
reverse(sum+1,sum+1+n);
ll ans=0;
cnt[0]++;
for(int i=1;i<=n;++i){
sum[i]=(sum[i-1]+sum[i]*qpow(10,i-1)%mod)%mod;
ans+=cnt[sum[i]];
cnt[sum[i]]++;
}
cout<<ans<<"\n";
return 0;
}

CAD加油!欢迎跟我一起讨论学习算法