Codeforces Round #279 (Div. 2) C. Hacking Cypher 大数除法+枚举
2015-07-22 14:00
495 查看
思路:刚开始使用大数除法,枚举分割点,复杂度O(n^2)肯定超时。除法代码如下:
但是仔细观察发现,在作大数除法的时候,其实有隐含的递推关系在里面:
rest[i + 1] = (rest[i] * 10 + s[i]) % x(高位在左).
所以可以通过预处理将内层循环的O(n)降至常数时间。对a和对b预处理方式略有不同。
①从高位到低位对a进行预处理,rest[i + 1] = (rest[i] * 10 + s[i]) % a;
②从低位到高位对b进行预处理,rest[i] = (rest[i - 1] + s[i] * 10^i) % b;
由于模运算的特性,(s[i] * 10^i) % b = (s[i] * (10^i % b)) % b,而10^i % b也可以通过递推进行预处理得到:f[i + 1] = (f[i] * 10) % b;
代码如下:
bool is_divisible(int st, int en, int x){ int over = 0; for(int i = st; i <= en; ++i) over = (over * 10 + a[i] - '0') % x; if(over == 0) return true; return false; }
但是仔细观察发现,在作大数除法的时候,其实有隐含的递推关系在里面:
rest[i + 1] = (rest[i] * 10 + s[i]) % x(高位在左).
所以可以通过预处理将内层循环的O(n)降至常数时间。对a和对b预处理方式略有不同。
①从高位到低位对a进行预处理,rest[i + 1] = (rest[i] * 10 + s[i]) % a;
②从低位到高位对b进行预处理,rest[i] = (rest[i - 1] + s[i] * 10^i) % b;
由于模运算的特性,(s[i] * 10^i) % b = (s[i] * (10^i % b)) % b,而10^i % b也可以通过递推进行预处理得到:f[i + 1] = (f[i] * 10) % b;
代码如下:
#include <cstdio> #include <cstring> using namespace std; #define N 1000005 char s , left , right ; int a_rest , b_rest , digit ; int main(){ int a, b, len; bool found = false; scanf("%s", s); scanf("%d %d", &a, &b); len = strlen(s); a_rest[0] = (s[0] - '0') % a; for(int i = 1; i < len; ++i) a_rest[i] = (a_rest[i - 1] * 10 + s[i] - '0') % a; digit[len - 1] = 1 % b; for(int i = len - 2; i >= 0; --i) digit[i] = digit[i + 1] * 10 % b; b_rest[len - 1] = (s[len - 1] - '0') % b; for(int i = len - 2; i >= 0; --i){ b_rest[i] = (b_rest[i + 1] + digit[i] * (s[i] - '0')) % b; } for(int i = len - 1; i > 0; --i){ if(a_rest[i - 1] == 0 && b_rest[i] == 0){ if(s[i] != '0'){ found = true; strncpy(left, s, i), strncpy(right, s + i, len - i); break; } } } if(!found) printf("NO\n"); else{ printf("YES\n"); printf("%s\n%s\n", left, right); } return 0; }
相关文章推荐
- Ruby Array
- VBA EXCEL 工作簿之间相互操作
- ubuntu14.04.2开启vnc远程连接
- 一花一世界,一叶一菩提
- Android 回调函数示例
- IOS自定义UITableViewCell的高亮背景色
- 给“夜猫子”程序员的科学熬夜指南
- 电子商务网站-数据库设计
- postMessage
- [LeetCode]Maximum Depth of Binary Tree
- 2015多校赛第一场
- WNDCLASS结构中cbWndExtra数据成员的作用
- 如何在页面打开后根据条件让EditorGridPanel的某一行的复选框默认选中?
- java List.subList()方法类似分页分批处理数据
- html from嵌套from
- 夏令营第一期——【一】迎接初升朝阳的序幕
- Linux netlink
- LeetCode Bitwise AND of Numbers Range
- Android SDK在线更新镜像服务器
- HDOJ4552怪盗基德的挑战书