题目链接:

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,这样就可以了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long LL;
  7.  
  8. const int maxn = ;
  9.  
  10. int fib[maxn];
  11.  
  12. int tot;
  13. void get_fib() {
  14. fib[] = , fib[] = ;
  15. for (tot = ;; tot++) {
  16. fib[tot] = fib[tot - ] + fib[tot - ];
  17. if (fib[tot] >) break;
  18. }
  19. }
  20.  
  21. int di[maxn], n;
  22.  
  23. void init() {
  24. n = ;
  25. }
  26.  
  27. int main() {
  28. get_fib();
  29. int tc;
  30. scanf("%d", &tc);
  31. while (tc--) {
  32. init();
  33. int x;
  34. scanf("%d", &x);
  35. if (x == ||x==) {
  36. puts("Yes"); continue;
  37. }
  38. for (int i = ; i < tot; i++) {
  39. if (x%fib[i] == ) {
  40. di[n++] = fib[i];
  41. }
  42. }
  43. bool su = false;
  44. for (int stat = ; stat < ( << n); stat++) {
  45. int tmp = x;
  46. for (int i = n-; i >=; i--) {
  47. if (stat&( << i)) {
  48. while (tmp%di[i] == ) tmp /= di[i];
  49. }
  50. }
  51. if (tmp == ) {
  52. su = true; break;
  53. }
  54. }
  55. if (su) puts("Yes");
  56. else puts("No");
  57. }
  58. return ;
  59. }
  60. /*
  61. 68
  62. */

2、直接暴搜

看完题解哭晕。。

而且跑的溜溜的orz

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long LL;
  7.  
  8. const int maxn = ;
  9.  
  10. int fib[maxn];
  11.  
  12. int tot;
  13. void get_fib() {
  14. fib[] = , fib[] = ;
  15. for (tot = ;; tot++) {
  16. fib[tot] = fib[tot - ] + fib[tot - ];
  17. if (fib[tot] >) break;
  18. }
  19. }
  20.  
  21. int di[maxn], n;
  22.  
  23. bool dfs(int cur, int x) {
  24. if (x == ) return true;
  25. if (cur == n) return false;
  26. if (dfs(cur + , x)) return true;
  27.  
  28. if (x%di[cur]==) {
  29. int tmp = x;
  30. while (tmp%di[cur] == ) {
  31. tmp /= di[cur];
  32. //printf("tmp:%d\n", tmp);
  33. if (dfs(cur + , tmp)) return true;
  34. }
  35. }
  36. return false;
  37. }
  38.  
  39. void init() {
  40. n = ;
  41. }
  42.  
  43. int main() {
  44. get_fib();
  45. int tc;
  46. scanf("%d", &tc);
  47. while (tc--) {
  48. init();
  49. int x;
  50. scanf("%d", &x);
  51. if (x == ||x==) {
  52. puts("Yes"); continue;
  53. }
  54. for (int i = ; i < tot; i++) {
  55. if (x%fib[i] == ) {
  56. di[n++] = fib[i];
  57. }
  58. }
  59. //printf("n:%d\n", n);
  60. if (dfs(,x)) puts("Yes");
  61. else puts("No");
  62. }
  63. return ;
  64. }

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. KKT原理以及SVM数学的理论推导分析

    一直很好奇机器学习实战中的SVM优化部分的数学运算式是如何得出的,如何转化成了含有内积的运算式,今天上了一节课有了让我很深的启发,也明白了数学表达式推导的全过程. 对于一个SVM问题,优化的关键在于 ...

  2. QEMU 模拟运行 VxWorks 6.6

    QEMU 模拟运行 VxWorks 6.6 项目简介 本项目是在 Windows 系统编译运行 X86 平台 VxWorks 6.6 系统,使用的模拟软件是 qemu for Windows Host ...

  3. Oracle入门第一天(上)——简介与安装

    一.Oracle介绍  Oracle 公司是全球最大的信息管理软件及服务供应商,成立于1977年 Oracle 公司因其复杂的关系数据库产品而闻名.Oracle的关系数据库是世界第一个支持SQL语言的 ...

  4. 20155308 2016-2017-2《Java程序设计》课程总结

    20155308 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:回答"我专业吗.我的老师.师生关系.代码问题"四个问题. 预备作业2 ...

  5. 20155315 2016-2017-2 实验二《Java面向对象程序设计》实验报告

    实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验知识点 1.参考Intellj I ...

  6. 20145226夏艺华 《Java程序设计》第9周学习总结

    教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛型和自定义枚举 会使用标准注解 第16章 整合数据库 16.1 JDBC入门 (一)JDB ...

  7. install netcdf

    https://gist.github.com/perrette/cd815d03830b53e24c82

  8. docker容器的启动、停止、运行、导入、导出、删除

    原文:docker容器的启动.停止.运行.导入.导出.删除 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/jiang425776024/articl ...

  9. WEB项目日志分析系统思考

    一.为什么需要日志分析系统 对ETL系统中数据转换和存储操作的相关日志进行记录以及实时分析有助于我们更好的观察和监控ETL系统的相关指标(如单位时间某些操作的处理时间),发现系统中出现的缺陷和性能瓶颈 ...

  10. iOS 影音新格式 HEIF HEVC

    苹果在 iOS 11 的发布会上,推出了两种新的媒体格式 HEIF HEVC,都是为了保证画质的情况下,大大减少视频.照片的大小. 一.简介 HEVC全称 High Efficiency Video ...