dp[0][(a[0]-'0')%3]=1;
    for(int i=1;i<len;i++){
        int x=(a[i]-'0')%3;
        dp[i][x]=(dp[i][x]+1)%mod;
        for(int j=0;j<3;j++){
            dp[i][j]+=(dp[i-1][j]+dp[i-1][(j+3-x)%3])%mod;
        }
    }

很明显dp[i][j]代表着第i个数除以3得到的余数j的个数。

dp[i][j]+=(dp[i-1][j]+dp[i-1][(j+3-x)%3])%mod;

这句话的意思是:当前第i个数余数j+前一个(i-1)数的余数j的个数+前一个(i-1)数的(j+3-x)%3(该数是能够与余数m相加得到余数j)

最后得到结果:

cout<<dp[len][0];

表示到达最后一个数并且能够被3整除的个数。