HDU 5167 Fibonacci 筛法+乱搞
题目链接:
hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5167
题意:
给你一个x,判断x能不能由斐波那契数列中的数相乘得到(一个数可以重复使用)
题解:
1、筛法
首先,小于10^9的斐波那契数很少,就42个(不包括0,1),对于给定的x能同时成为它的因子的斐波那契数更少,所以可以暴力考虑所有能整除x的斐波那契数组成的集合的所有子集。
但是,对于每个子集做筛法的时候必须从大的数开始筛(质因数分解可以随便筛是因为一个数的质因数分解具有唯一性,但这里并不具有唯一性),因为大的数比小的数更特别,它可能具有小的数不具备的组成x的质因子,如果它具备独特质因子,那它就要筛到不能筛为止,如果它不具备独特质因子,它多筛了也不影响的,所以从大到小的做保证了正确的分解不会丢失。
68=2*34=2*2*17,如果从小到大筛,会把2全筛了,剩下个17是没办法筛掉的,而如从后往前则会先筛掉34,再筛掉一个2,这样就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL; const int maxn = ; int fib[maxn]; int tot;
void get_fib() {
fib[] = , fib[] = ;
for (tot = ;; tot++) {
fib[tot] = fib[tot - ] + fib[tot - ];
if (fib[tot] >) break;
}
} int di[maxn], n; void init() {
n = ;
} int main() {
get_fib();
int tc;
scanf("%d", &tc);
while (tc--) {
init();
int x;
scanf("%d", &x);
if (x == ||x==) {
puts("Yes"); continue;
}
for (int i = ; i < tot; i++) {
if (x%fib[i] == ) {
di[n++] = fib[i];
}
}
bool su = false;
for (int stat = ; stat < ( << n); stat++) {
int tmp = x;
for (int i = n-; i >=; i--) {
if (stat&( << i)) {
while (tmp%di[i] == ) tmp /= di[i];
}
}
if (tmp == ) {
su = true; break;
}
}
if (su) puts("Yes");
else puts("No");
}
return ;
}
/*
68
*/
2、直接暴搜
看完题解哭晕。。
而且跑的溜溜的orz
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL; const int maxn = ; int fib[maxn]; int tot;
void get_fib() {
fib[] = , fib[] = ;
for (tot = ;; tot++) {
fib[tot] = fib[tot - ] + fib[tot - ];
if (fib[tot] >) break;
}
} int di[maxn], n; bool dfs(int cur, int x) {
if (x == ) return true;
if (cur == n) return false;
if (dfs(cur + , x)) return true; if (x%di[cur]==) {
int tmp = x;
while (tmp%di[cur] == ) {
tmp /= di[cur];
//printf("tmp:%d\n", tmp);
if (dfs(cur + , tmp)) return true;
}
}
return false;
} void init() {
n = ;
} int main() {
get_fib();
int tc;
scanf("%d", &tc);
while (tc--) {
init();
int x;
scanf("%d", &x);
if (x == ||x==) {
puts("Yes"); continue;
}
for (int i = ; i < tot; i++) {
if (x%fib[i] == ) {
di[n++] = fib[i];
}
}
//printf("n:%d\n", n);
if (dfs(,x)) puts("Yes");
else puts("No");
}
return ;
}
HDU 5167 Fibonacci 筛法+乱搞的更多相关文章
- hdu 4786 Fibonacci Tree 乱搞 智商题目 最小生成树
首先计算图的联通情况,如果图本身不联通一定不会出现生成树,输出"NO",之后清空,加白边,看最多能加多少条,清空,加黑边,看能加多少条,即可得白边的最大值与最小值,之后判断Fibo ...
- hdu 5167 Fibonacci 打表
Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Proble ...
- hdu 5167 Fibonacci(预处理)
Problem Description Following is the recursive definition of Fibonacci sequence: Fi=⎧⎩⎨01Fi−1+Fi−2i ...
- BZOJ-1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 筛法+乱搞
1607: [Usaco2008 Dec]Patting Heads 轻拍牛头 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 1383 Solved: 7 ...
- HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...
- hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 5246 乱搞
题意:题目太长直接看链接 链接:点我 乱搞题 显然,一个人要想成功,必须大于等于最强的人的战斗力,所以我们从后往前看 这里直接拿例1解释,首先递减排个序 15,13,10,9,8 作差得2,3,1,1 ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
随机推荐
- JQuery中事件冒泡
JQuery中事件冒泡 定义 在一个对象上触发某类事件,就会执行此事件程序,如果没有处理事件就会向这个对象的父级对象传播 直至它被处理,最顶层老大为document对象. 作用 事件冒泡允许多个操作被 ...
- docker 入门 (二)基本操作
这一篇讲docker的基本操作. 请自行安装docker到自己的电脑上. 镜像的获取 要获取镜像,最简单的当然是从仓库去获取,docker的官方网站很不好练,其他的可选项有docker中国官网,阿里镜 ...
- vue---class和style的基本用法
不多BB了 直接上代码了 通俗移动易懂总结了5种常用改变样式 的形式 <style> .actived2{ color:red; } </style> </head> ...
- Redis底层数据类型
Redis主要数据结构:简单动态字符串(SDS).双端链表.字典.跳跃表.整数集合.压缩列表和快速列表: 一.简单动态字符串(SDS): Redis没有直接使用C语言中的传统的字节数组保存字符串,而是 ...
- C语言下的错误处理问题
今天来分享我认为比较好的几种在C语言下的错误处理方式 方式一: int example(int num) { ) { ; } ; } 在不符合条件的情况下使用return终止程序 方式二: void ...
- C语言/C++编程学习:栈的代码实现之数组方案
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 查询系统日期和时间(mysql)
select current_date --不带时间select sysdate() 或 SELECT NOW(); --带时间
- Jenkins CLI 通过ssh方式链接时的证书
在Jenkins自己的配置文档下,并没有详细说明要如何生成ssh证书,不过随便网上查一查就会有很多. 这里记录一个坑: 这个ssh必须要用ssh2!!! 这个ssh必须要用ssh2!!! 这个ssh必 ...
- [ASP.NET Core] 建置x86版本 (workaround)
前言 本篇文章介绍如何建置ASP.NET Core项目的x86版本输出(workaround),为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 步骤 首先到微软官网的「. ...
- Redash二次开发-开发环境搭建
环境:win7+pycharm 2018.2 +redash 1.安装pycharm并如何正常使用,找度娘. 2.配置pycharm vcs,设置github用户,从github新建redash项目 ...