简单说下题意,给定一个数字串,问有多少的子串可以被3整除。
首先一个数如果可以被3整除,那么这个数各位和一定可以被3整除。所以这个题应该是线性dp,我们定义dp[i][j]为前i个中整除3余数为j(只有0,1,2三个数)的个数,然后从头到尾线性dp一遍就可以了。
下面看一下代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int main(){
string t;
cin>>t;
int len=t.length();
int dp[55][3];
memset(dp,0,sizeof(dp));
int m=0;
dp[0][(t[0]-'0')%3]=1;
for(int i=1;i<len;i++){
m=(t[i]-'0')%3;
dp[i][m]=(dp[i][m]+1)%mod;
for(int j=0;j<3;j++){
dp[i][j]+=(dp[i-1][j]+dp[i-1][(j+3-m)%3])%mod;
}
//dp[i][m]=(dp[i][m]+1)%mod;
}
/*for(int q=0;q<len;q++){
for(int w=0;w<3;w++){
cout<<dp[q][w]<<" ";
}
cout<<endl;
}*/
cout<<dp[len-1][0]%mod<<endl;
return 0;
}