题目链接:

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 筛法+乱搞的更多相关文章

  1. hdu 4786 Fibonacci Tree 乱搞 智商题目 最小生成树

    首先计算图的联通情况,如果图本身不联通一定不会出现生成树,输出"NO",之后清空,加白边,看最多能加多少条,清空,加黑边,看能加多少条,即可得白边的最大值与最小值,之后判断Fibo ...

  2. hdu 5167 Fibonacci 打表

    Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Proble ...

  3. hdu 5167 Fibonacci(预处理)

    Problem Description Following is the recursive definition of Fibonacci sequence: Fi=⎧⎩⎨01Fi−1+Fi−2i ...

  4. BZOJ-1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 筛法+乱搞

    1607: [Usaco2008 Dec]Patting Heads 轻拍牛头 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 1383 Solved: 7 ...

  5. HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...

  6. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  7. hdu 5246 乱搞

    题意:题目太长直接看链接 链接:点我 乱搞题 显然,一个人要想成功,必须大于等于最强的人的战斗力,所以我们从后往前看 这里直接拿例1解释,首先递减排个序 15,13,10,9,8 作差得2,3,1,1 ...

  8. URAL 1827 Indigenous Wars(排序、乱搞)

    题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...

  9. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

随机推荐

  1. 大数据学习--day13(字符串String--源码分析--JVM内存分析)

    字符串String--源码分析--JVM内存分析 String 类的对象 , 是不可变的字符串对象呢 这个不可变很重要,之后要讲的intern()也离不开它的不可变性. https://www.cnb ...

  2. IAR新建MSP430工程

    一.在IAR官网下载IAR for MSP430 软件 https://www.iar.com/iar-embedded-workbench/#!?architecture= 选择MSP430,然后 ...

  3. python学习笔记:第9天 函数初步

    1. 函数的定义及调用 函数:所谓的函数可以看作是对一段代码的封装,也是对一个功能模块的封装,这样方便在下次想用这个功能的时候直接调用这个功能模块,而不用重新去写. 函数的定义:我们使用def关键字来 ...

  4. EOS节点远程代码执行漏洞细节

    这是一个缓冲区溢出越界写漏洞 漏洞存在于在 libraries/chain/webassembly/binaryen.cpp文件的78行, Function binaryen_runtime::ins ...

  5. Xilinx FPGA高速串行收发器简介

    1 Overview 与传统的并行实现方法相比,基于串行I/O的设计具有很多优势,包括:器件引脚数较少.降低了板空间要求.印刷电路板(PCB)层数较少.可以轻松实现PCB设计.连接器较小.电磁干扰降低 ...

  6. 20155212 实验二 Java面向对象程序设计

    20155212 实验二 Java面向对象程序设计 单元测试 三种代码 用编程去解决问题,必须学会写三种码: 伪代码 产品代码 测试代码 例: MyUtil 类解决一个百分制成绩转成"优.良 ...

  7. day1 HTML - <head>

    1.html是什么? 超文本标记语言(Hypertext Markup Language,HTML) <!DOCTYPE html> <html lang="en" ...

  8. mongdb基础

    查看数据库 show dbs; 切换到需要使用的数据库:use local; 显示集合中的数据库表:show collections; 切换到数据库test,如果数据库不存在,则自动创建 插入数据 d ...

  9. macOS 10.14 Mojave 开发环境配置Apache多PHP版本

    第1部分:macOS 10.14 Mojave Web开发环境 在macOS上开发Web应用程序真是一种乐趣.设置开发环境有很多选择,包括广受欢迎的MAMP Pro,它在Apache,PHP和MySQ ...

  10. java阻塞队列之ArrayBlockingQueue

    在Java的java.util.concurrent包中定义了和多线程并发相关的操作,有许多好用的工具类,今天就来看下阻塞队列.阻塞队列很好的解决了多线程中数据的安全传输问题,其中最典型的例子就是客园 ...