Multiple of 2019

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;
}
posted @ 2020-04-27 10:22  caoanda  阅读(240)  评论(0编辑  收藏  举报