AB数(from pongo)
来源:互联网 发布:无线传感器网络专利 编辑:程序博客网 时间:2024/05/21 21:00
问题:
给定两个正整数a,b,分别定义两个集合L和R,
集合L:即把1~a,1~b中整数乘积的集合定义为L = {x * y | x,y是整数且1 <= x <=a , 1 <= y <= b};
集合R:1~a,1~b中整数异或的集合定义为集合R = {x ^ y | x,y是整数且1 <= x <=a , 1 <= y <= b},其中^表示异或运算。
现从L中任取一个整数作为A,从R中任取一个整数作为B,如果必要在B的左边补0,使得B达到:“b的位数+1”位(十进制),然后把B接到A的右边,形成的一个十进制数AB。求所有这样形成数的和。
输入a,b 1<=a<=30, 1<=b<=10000000。
输出所有产生的AB数的和,由于结果比较大,输出对1000000007取余数的结果。
例如:a = 2, b = 4,
则L = {1 * 1, 1 * 2, 1 * 3, 1 * 4, 2 * 1, 2 * 2, 2 * 3, 2 * 4} = {1, 2, 3, 4, 6, 8}
R = {1^1,1^2,1^3,1^4,2^1,2^2,2^3,2^4} = {0, 1, 2, 3, 5, 6}
相接的时候保证R中的数至少有两位,所以相接后所有的AB数的集合是
{
100, 101, 102, 103, 105, 106,
200, 201, 202, 203, 205, 206,
300, 301, 302, 303, 305, 306,
400, 401, 402, 403, 405, 406,
600, 601, 602, 603, 605, 606,
800, 801, 802, 803, 805, 806
}
输出它们的和:14502。
做法:
最终需要求解集合L元素和及元素个数、集合R的元素和及元素个数。
result = sum_L*num_R*(10^bitnum_b)+sum_R*num_L
计算集合R时考虑到a的范围较小,只会影响到1~b中数字的后五位(二进制位),使其增加量或减少量均不会超过31,因此,只需要去考虑1~b的最后31个数与1~a相互异或,产生的大于b的结果加上1~b就是异或一组的全部结果。
计算集合L可以利用容斥原理求解,即求出1~a与1~b直接相乘的和与个数,然后减去1~a中两两组合的公倍数的造成的重复,再加上三三组合的公倍数造成的重复......。但是直接这样计算,运算量会达到2^a,显然会超时。
降低运算量的技巧在于构造初始的基本集合时尽可能使其与已经构造出的基本集合无交集。这里的基本集合指的是1的1~b倍,2的1~b倍...a的1~b倍,这a个集合。例如1与1~b相乘后,维护一个起始倍数数组,2的起始倍数从1变为b/2,3的起始倍数从1变为b/3,a的起始倍数从1变为b/a。2与b/2+1~b相乘后,4,6,8...的起始倍数分别增大。这样一来构造出的基本集合中有倍数关系的肯定没有交集。利用起始倍数数组也很容易得到和某个数i的基本集合有交集的其他基本集合。
以1~30为例,最大有公共交集的基本集合个数为10,即2,3,5,7,11,13,17,19,23,29。
复杂度大约为2^numP,numP表示1~a范围内的质数的个数。
- AB数(from pongo)
- 几个bing?(from pongo)
- 覆盖数字(from pongo)
- 均分01(from pongo)
- 最长有效括号长度(from pongo)
- 三元组的数量(from pongo)
- csdn英雄会(pongo)题解之回文数
- 英雄会(csdn pongo)题解之求导数
- pongo(csdn英雄会)题解之最小操作数---leetcode之word ladder2
- csdn英雄会(pongo)题解之二十进制数的加法
- csdn英雄会(pongo)题解之回文数--源代码、测试用例、运行结果
- 求AB数
- 二进制数中1的个数(拓展-比较二进制数AB不同)
- pongo(英雄会)题解之理想随机数发生器
- pongo(英雄会)题解之理想随机数发生器
- pongo(英雄会)题解之均分01
- csdn英雄会(pongo)题解之报数游戏
- csdn英雄会(pongo)题解之报数游戏2
- 关于 win8.1 玩冒险岛问题
- Android视频开发一
- FLEX+C#上传文件
- JQuery六:特效
- JUnit小入门
- AB数(from pongo)
- Ubuntu无法ssh远程连接问题
- 分享解决jar包冲突问题的方法:(看了这个你就能解决所有包冲突问题!)
- PHPcms v9 get标签sql 语句limit无效问题的解决方法
- poj1013
- bootloader-bootable解析
- 20131227-enhance-linux
- struct 登录拦截器
- Android学习之Tab