HUST

input

长度不大于3*10e5的数字串

output

不含前导0的能整除64的字串的个数(0算一个,064不算)

一般数组中找能整除一个数的字串都是用取余来做的

用一个a[64]来存下从1-i位累加到第i位的余数为0-63的个数,每次都加上余数为0的个数,第一位为0的只统计一次,不加入a数组中

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 char s[300010];
 8 int a[2][64],b[64],sum,d;
 9 
10 int main()
11 {
12     while(scanf("%s",s)==1)
13     {
14         memset(a,0,sizeof(a));
15         sum=0;
16         d=1;
17         for(int i=0;s[i];i++)
18         {
19             memset(a[d^1],0,sizeof(a[0]));
20             if(s[i]!='0') a[d][0]++;
21             else sum++;
22             for(int j=0;j<64;j++)
23             {
24                 int t=j*10+s[i]-'0';
25                 a[d^1][t%64]+=a[d][j];
26             }
27             sum+=a[d^1][0];
28             d^=1;
29         }
30         printf("%d
",sum);
31     }
32     return 0;
33 }
View Code
原文地址:https://www.cnblogs.com/cdyboke/p/4930726.html