表示我这种蒟蒻面对这种递推第一思想显然是打表啊

先贴个用来打表的暴力:

  1. #include <cstdio>
  2. struct node
  3. {
  4.     int l,r;
  5. }p[];
  6. bool used[];
  7. int f[];
  8. int n,cnt,cct;
  9. int findf(int x)
  10. {
  11.     if(x==f[x])
  12.     {
  13.         return x;
  14.     }
  15.     return f[x]=findf(f[x]);
  16. }
  17. bool check()
  18. {
  19.     for(int i=;i<=n+;i++)
  20.     {
  21.         f[i]=i;
  22.     }
  23.     for(int i=;i<=cct;i++)
  24.     {
  25.         if(used[i])
  26.         {
  27.             int f1=findf(p[i].l);
  28.             int f2=findf(p[i].r);
  29.             f[f2]=f1;
  30.         }
  31.     }
  32.     int ff=;
  33.     for(int i=;i<=n+;i++)
  34.     {
  35.         int f1=findf(i);
  36.         if(!ff)
  37.         {
  38.             ff=f1;
  39.         }else if(ff!=f1)
  40.         {
  41.             return ;
  42.         }
  43.     }
  44.     return ;
  45. }
  46. void dfs(int dep,int tot)
  47. {
  48.     if(dep==cct+)
  49.     {
  50.         if(tot==n)
  51.         {
  52.             if(check())
  53.             {
  54.                 cnt++;
  55.             }
  56.         }
  57.         return;
  58.     }
  59.     used[dep]=;
  60.     dfs(dep+,tot+);
  61.     used[dep]=;
  62.     dfs(dep+,tot);
  63. }
  64. int main()
  65. {
  66.     scanf("%d",&n);    
  67.     for(int i=;i<=n+;i++)
  68.     {
  69.         p[++cct].l=;
  70.         p[cct].r=i;    
  71.     }
  72.     for(int i=;i<=n+;i++)
  73.     {
  74.         if(i==n+)
  75.         {
  76.             p[++cct].l=i;
  77.             p[cct].r=;
  78.         }else
  79.         {
  80.             p[++cct].l=i;
  81.             p[cct].r=i+;
  82.         }
  83.     }
  84.     dfs(,);
  85.     printf("%d\n",cnt);
  86.     return ;
  87. }
  88. /*
  89. 1 1
  90. 2 5
  91. 3 16
  92. 4 45
  93. 5 121
  94. 6 320
  95. */

实测这个打表程序是正确的(可以获得30分)

接下来是本人心路历程:

观察一下:1-1,2-5,3-16,4-45...找一下前后项吧!

观察前后项的倍数关系应该在2~3之间,那先定一个基础表达式

f[i]=2f[i-1]+...或f[i]=3f[i-1]+...

如果系数用2,发现剩下的部分长这样啊...

f[3]=2f[2]+6

f[4]=2f[3]+13

f[5]=2f[4]+31

...

好像后面的没啥规律...

那换系数用3!

f[4]=3f[3]-3

f[5]=3f[4]-14

...

好像也没啥啊...

等一下!

-3=-5+2

-14=-16+2

如果下面再写下来,应该是-43=-45+2!

这不就找出来了吗!

f[i]=3f[i-1]-f[i-2]+2!

于是敲个高精度这题就结束了...

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <stack>
  9. using namespace std;
  10. struct Bignum
  11. {
  12. int a[10005];
  13. int ilen;
  14. }f[105],zero;
  15. int n;
  16. Bignum add(Bignum x)
  17. {
  18. Bignum ret=x;
  19. ret.a[1]+=2;
  20. int i=1;
  21. while(ret.a[i]>=10)
  22. {
  23. ret.a[i+1]+=ret.a[i]/10;
  24. ret.a[i]%=10;
  25. i++;
  26. }
  27. if(ret.a[ret.ilen+1])
  28. {
  29. ret.ilen++;
  30. }
  31. return ret;
  32. }
  33. Bignum mul(Bignum x)
  34. {
  35. Bignum ret=zero;
  36. for(int i=1;i<=x.ilen;i++)
  37. {
  38. ret.a[i]+=3*x.a[i];
  39. ret.a[i+1]+=ret.a[i]/10;
  40. ret.a[i]%=10;
  41. }
  42. ret.ilen=x.ilen;
  43. while(ret.a[ret.ilen+1])
  44. {
  45. ret.ilen++;
  46. }
  47. return ret;
  48. }
  49. Bignum sub(Bignum x,Bignum y)
  50. {
  51. Bignum ret=zero;
  52. for(int i=1;i<=y.ilen;i++)
  53. {
  54. ret.a[i]+=x.a[i]-y.a[i];
  55. if(ret.a[i]<0)
  56. {
  57. ret.a[i]+=10;
  58. ret.a[i+1]--;
  59. }
  60. }
  61. for(int i=y.ilen+1;i<=x.ilen;i++)
  62. {
  63. ret.a[i]+=x.a[i];
  64. }
  65. ret.ilen=x.ilen;
  66. while(!ret.a[ret.ilen]&&ret.ilen>1)
  67. {
  68. ret.ilen--;
  69. }
  70. return ret;
  71. }
  72. int main()
  73. {
  74. scanf("%d",&n);
  75. f[1].a[1]=1;
  76. f[1].ilen=1;
  77. f[2].a[1]=5;
  78. f[2].ilen=1;
  79. f[3].a[1]=6;
  80. f[3].a[2]=1;
  81. f[3].ilen=2;
  82. for(int i=4;i<=n;i++)
  83. {
  84. f[i]=mul(f[i-1]);
  85. f[i]=add(f[i]);
  86. f[i]=sub(f[i],f[i-2]);
  87. }
  88. for(int i=f[n].ilen;i>=1;i--)
  89. {
  90. printf("%d",f[n].a[i]);
  91. }
  92. printf("\n");
  93. return 0;
  94. }

  

bzoj 1002的更多相关文章

  1. bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2234  Solved: 1227[Submit][Statu ...

  2. BZOJ 1002 轮状病毒

    Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...

  3. 生成树的计数(基尔霍夫矩阵):BZOJ 1002 [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3928  Solved: 2154[Submit][Statu ...

  4. BZOJ 1002 [FJOI2007]轮状病毒

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3106  Solved: 1724[Submit][Statu ...

  5. BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5577  Solved: 3031[Submit][Statu ...

  6. BZOJ 1002 - 轮状病毒 - [基尔霍夫矩阵(待补)+高精度]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生 ...

  7. bzoj 1002 [FJOI2007]轮状病毒——打表找规律

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 看 Zinn 的博客:https://www.cnblogs.com/Zinn/p/9 ...

  8. BZOJ 1002 轮状病毒 矩阵树定理

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1002 题目大意: 给定n(N<=100),编程计算有多少个不同的n轮状病毒 思路 ...

  9. AC日记——[FJOI2007]轮状病毒 bzoj 1002

    1002 思路: 打表找规律: dp[i]=dp[i-1]*3-dp[i-2]+2; 套个高精就a了: 代码: #include <cstdio> #include <cstring ...

  10. BZOJ 1002 [ FJOI 2007 ]

    -------------------------萌萌哒分割线------------------------- 题目很容易看懂,数据范围也不大.当然可以卡过暴力的人了. 在n=1时很明显是一种,如下 ...

随机推荐

  1. Python 爬虫三 beautifulsoup模块

    beautifulsoup模块 BeautifulSoup模块 BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查 ...

  2. 【Thymeleaf】Thymeleaf模板对html实时刷新

    解决方案 spring: thymeleaf: cache: false 修改完html代码后Ctrl+Shift+F9,重新编译即可刷新页面内容!

  3. META-INF文件夹中的MANIFEST.MF 的作用

    manifest文件是用来描述jar包的,它描述了该jar包的代码是谁的,什么版本,使用什么版本的类库等等....具体如下: 1.基础格式 manifest 文件的格式是很简单的,每一行都是 名-值 ...

  4. eclipse使用异常An error has occurred.see error log for more details eclipse

    eclipse使用异常An error has occurred.see error log for more details eclipse 解决Eclipse,MyEclipse出现An erro ...

  5. OGG初始加载过程概述

    您可以使用Oracle GoldenGate来: 执行独立的批量加载以填充数据库表以进行迁移或其他用途. 将数据作为初始同步运行的一部分加载到数据库表中,以准备与Oracle GoldenGate进行 ...

  6. C#如何操作XML文件

    ⒈XML? XML是一种可扩展的标记语言 具有以下特点 1.严格区分大小写 2.标签成对出现 3.有且只有一个根节点 ⒉XML的创建 <?xml version="1.0" ...

  7. DevExpress VCL 的 cxDBTreeList 的使用方法

    DevExpress VCL 的 cxDBTreeList 的使用方法:(假设控件名为: WBSTree) 1.控件WBSTree 通过绑定  DataSet 获取数据记录(Nodes),通过 Col ...

  8. sublime修改侧边栏字体

    安装了sublime的material主题后,侧边栏的字体特别小,设置方法如下: 安装插件 用上面的插件打开 Material-Theme.sublime-theme 如下 { "class ...

  9. T-SQL GROUP BY子句 分组查询

    SQL Server GROUP BY子句与SELECT语句协作使用,以将相同的数据分组. GROUP BY子句位于SELECT语句中的WHERE子句之后,位于ORDER BY子句之前. 语法 以下是 ...

  10. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...