-
时间:2016-04-08 13:24:57 星期五
-
题目编号:[2016-04-08][codeforces][628][B][New Skateboard]
-
题目大意:给定一个长度最大为3×1053×105的字符串,问有多少个能被4整除的子串,
-
分析:
- 每个数字后面两位数能被4整除,那么这个数字就能被4整除
- dp[i]表示从0~i这一段字符能被4整除的数目,那么dp[i] = dp[i - 1] + (a[i]%4 == 0) + ((a[i-1] * 10 + a[i])%4?0:i)
- 即,如果第i位能被4整除,那么答案要+1,如果增加第i位后,后面两位能被4整除,那么答案就要加上i,因为由包括后面两位的字符串有i个
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int maxn = 3 * 1E5 + 10;
char str[maxn];
int main(){
scanf("%s",str);
int n = strlen(str);
LL ans = 0;int tmp;
for(int i = 0 ; i < n; ++i){
int tmp = str[i] - ‘0‘;
if(tmp % 4 == 0) ++ans;
if(i){
tmp = (str[i-1] - ‘0‘)*10 + tmp;
if(tmp % 4 == 0) ans += i;
}
}
printf("%I64d\n",ans);
return 0;
}
时间: 2024-10-19 19:29:08