标签:eof print his its scanf microsoft mil pass tar
题目来源::西安电子科技大学第16届程序设计竞赛网络同步赛
dp[i][j]表示以i这一位为最高位,模3等于j的方法数。那么转移就是:t=(j*2+a[i])%3 ,dp[i][t] = dp[i-1][j]; 还有一个转移是只包含第i位的方案所以dp[a[i]]]++;
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
char s[1000007];
ll dp[1000007][3];
int main(){
while(~scanf(" %s",s)) {int len=strlen(s);
memset(dp,0,sizeof(dp));
++dp[0][s[0]-‘0‘];
for(int i=1;i<len;++i){
for(int j=0;j<3;++j){
int t = (2*j%3+s[i]-‘0‘)%3;
dp[i][t]=dp[i-1][j];
}
++dp[i][s[i]-‘0‘];
}
ll ans = 0;
for(int i=0;i<len;++i)ans+=dp[i][0];
printf("%lld\n",ans);
}
}
标签:eof print his its scanf microsoft mil pass tar
原文地址:https://www.cnblogs.com/RRRR-wys/p/8904593.html