Factorials and Powers of Two

分析:我们可以看出这道题目的描述并不是很复杂,就是说对于一个给定的整数n,我们能否把他拆成k个powerful的数,也就是说这k个数要么是2的幂次,要么是某个数的阶乘,并且我们要让当前的k越小越好;然后如果不能被拆的话输出-1;
我们这样来看,先看会不会输出-1,我们如果把这个整数n用二进制的方法写出来,每个1都表明可以写成某个powerful的数,所以不可能输出-1;
那么我们就可以发现了k的个数就是这里二进制表示中1的个数,但是我们考虑到还有阶乘,我们令阶乘的和为s,个数为cnt,则k = cnt + F(n-s),这里的F函数就是根据二进制找1;
既然这样我们就可以枚举每个阶乘的可能性,我们发现14!已经是最大的可能了,因为15!就已经超过了1^12的数据范围,并且我们可以发现1!和2!是不需要考虑的,因为他们和幂次是一换一的关系没有必要,所以最多只需要枚举2^12次,找到最小值即可!
那么这里的关键是在于我怎么把这么多种可能枚举出来呢,很显然不适合用dfs,所以我们这里枚举i为0~1<<12,然后再去枚举j从0~11,看i&1<<j是否存在,存在的话就让s加上factorial[j+3],我们就是通过枚举12个位所有为0和为1的可能性,然后去看,就相当于是电路的12条并联的电路,只有对应通路的时候才会加上那条路的电阻!
代码:
- #include<bits/stdc++.h>
- #define INF 1100000000
- using namespace std;
- typedef long long LL;
- typedef pair<LL,LL> PII;
- LL fa[20],n;
- int k = INF;
- int find(LL x){
- int cnt = 0;
- while(x){
- cnt += x&1;
- x >>= 1;
- }
- return cnt;
- }
- int main()
- {
- int t;
- cin >> t;
- fa[1] = 1;
- fa[2] = 2;
- for(int i = 3;i<=14;i++) fa[i] = fa[i-1]*i;
- while(t--){
- k = 1100000000;
- cin >> n;
- for(int i = 0;i<(1<<12);i++){
- int cnt = 0;
- LL s = 0;
- for(int j = 0;j<=11;j++){
- if(i&(1<<j)){
- cnt++;
- s+=fa[j+3];
- }
- }
- if(s>n) continue;
- k = min(k,cnt + find(n - s));
- }
- cout << k << '\n';
- }
- return 0;
- }
Factorials and Powers of Two的更多相关文章
- HackerRank Extra long factorials
传送门 今天在HackerRank上翻到一道高精度题,于是乎就写了个高精度的模板,说是模板其实就只有乘法而已. Extra long factorials Authored by vatsalchan ...
- CodeForces 404C Ivan and Powers of Two
Ivan and Powers of Two Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & % ...
- 每日一九度之 题目1038:Sum of Factorials
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2109 解决:901 题目描述: John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, ...
- Educational Codeforces Round 15 Powers of Two
Powers of Two 题意: 让求ai+aj=2的x次幂的数有几对,且i < j. 题解: 首先要知道,排完序对答案是没有影响的,比如样例7 1一对,和1 7一对是样的,所以就可以排序之后 ...
- Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值
The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar fo ...
- POJ 1775 (ZOJ 2358) Sum of Factorials
Description John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, was a Hungarian-American mathematic ...
- cf702B Powers of Two
B. Powers of Two time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...
- (Problem 34)Digit factorials
145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all numbers which are ...
- (Problem 29)Distinct powers
Consider all integer combinations ofabfor 2a5 and 2b5: 22=4, 23=8, 24=16, 25=32 32=9, 33=27, 34=81, ...
随机推荐
- jq 页面添加布局
要求: 1)实现如上图页面布局(10分) 2)实现选择城市所添加的内容追加到你喜欢哪个城市下(10分) 3)实现选择游戏所添加的内容追加到你喜欢哪款游戏下(10分) 4)新增的数据字体颜色设置为粉色( ...
- tp 七牛云文件上传
1.先创建好七牛云账号和存储空间 申请七牛云账号: 创建七牛云存储空间: 在账号的秘钥管理里面创建秘钥 获取AccessKey / SecretKey: 2.集成PHP-SDK 七牛云开发文档:htt ...
- 浅识 npm 与 cnpm
npm是什么? Node Package(包) Manager(管理器) 的简称. 在 GitHub 还没有兴起的年代,前端是通过网址来共享代码.比如你想使用 jQuery,那么你点击 jQuery ...
- LGP4456题解
我就是不用矩阵快速幂! 题意:一个 \(\rm 01\) 序列为合法的当且仅当没有两个相邻的 \(1\),若 \(1\) 的个数为 \(x\),\(0\) 的个数为 \(y\),这个 \(\rm 01 ...
- CF1453D题解
VP 的时候发现的一道数学题( 在思考这个问题之前,先让我们思考一件事:走到距离上一个存档点 \(n\) 的位置的期望是多少?(假设这个值为 \(f[n]\)) 先思考 \(f[1]\) 是多少,很明 ...
- springboot自定义启动图画
小小娱乐,你是不是看到好多文章或段子上有这个 是不是很好玩,其实修改也很简单,就是在springboot的resources下新建一个banner.txt文件,将要输出图案放到txt文件中就好,启动时 ...
- Redis常见问题及其场景问题
假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以 某个固定的已知的前缀开头的,如果将它们全部找出来? 使用 keys 指令可以扫出指定模式的 key 列表. 对方接着追 ...
- @RequestMapping 注解?
该注解是用来映射一个URL到一个类或一个特定的方处理法上.
- Thread 类的 sleep()方法和对象的 wait()方法都可以让线 程暂停执行,它们有什么区别?
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程 暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保 持,因此休眠时间结束后会自动恢复(线程回 ...
- 面试问题之数据结构与算法:B树、B+树、B*树
一.B树 B树是一种多叉平衡查找树,由于是多叉结构,对于元素数量非常多的情况下,树的深度不会像二叉结构那么大,可以保证查询效率. 二.B+树 B+是是B树的一种变形, 1.特点: (1).所有叶子结点 ...