HUST - 1599 Multiple
input
长度不大于3*10e5的数字串
output
不含前导0的能整除64的字串的个数(0算一个,064不算)
一般数组中找能整除一个数的字串都是用取余来做的
用一个a[64]来存下从1-i位累加到第i位的余数为0-63的个数,每次都加上余数为0的个数,第一位为0的只统计一次,不加入a数组中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n",sum); 31 } 32 return 0; 33 }