HUST 1599 Multiple
题目大意 是给你一个字符串,问其中有多少个字串代表的数字能被64整除(注意不能有前导0 且 单独的'0'也是可以的)。 这题里的64是有些特殊的,,,因为1000000刚好能够整除64,这里就是突破口。 先预处理出字符串中不为0的数字的前缀和,,然后嵌套两个循环,将下标i从0扫到n-6,每次再暴搜i至i+6内的能整除64的个数, 再加上i下标的前缀和的数值。
放代码吧。。。:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 #include <cstdlib> 7 #include <cctype> 8 #include <queue> 9 #include <stack> 10 #include <map> 11 #include <vector> 12 #include <set> 13 #include <utility> 14 #define ll long long 15 #define inf 0x3f3f3f3f 16 using namespace std; 17 18 char str[300005]; 19 int len; 20 int front_sum[300005]; 21 void init() //预处理前缀和 22 { 23 len=strlen(str); 24 front_sum[0]=!!(str[0]-'0'); 25 for(int i=1;i<len-6;i++) 26 if(str[i]-'0') 27 front_sum[i]=front_sum[i-1]+1; 28 else 29 front_sum[i]=front_sum[i-1]; 30 } 31 ll solve() 32 { 33 ll res=0; 34 for(int i=0;i<len;i++) 35 { 36 int num=0; 37 if(str[i]=='0') //如果为0则也是一种情况 38 res++; 39 for(int j=0;j<6&&i+j<len;j++) //暴搜6位以内的个数 40 { 41 num=num*10+str[i+j]-'0'; 42 if(num%64==0&&str[i]!='0') //不能有前导0存在 43 res++; 44 } 45 if(num%64==0&&i+5<len&&i>0) //num为64倍数 且 该i到j这段的长度>=6 且 i不为第一个 46 res+=front_sum[i-1]; 47 } 48 return res; 49 } 50 int main() 51 { 52 //freopen("input.txt","r",stdin); 53 while(scanf("%s",str)!=EOF) 54 { 55 init(); 56 ll res=solve(); 57 printf("%lld\n",res); 58 } 59 return 0; 60 }