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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)