描述

如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的。

小Hi想知道在所有 n 位二进制数(一共有2n个)中,非法二进制数有多少个。

例如对于 n = 3,有 011, 110, 111 三个非法二进制数。

由于结果可能很大,你只需要输出模109+7的余数。

输入

一个整数 n (1 ≤ n ≤ 100)。

输出

n 位非法二进制数的数目模109+7的余数。

样例输入

3

样例输出

3

思路

首先用python打表,把符合条件的数前20个找到。然后BM板子过去或者。找规律,一个数的值等于他的前一项的值*2+一个斐波那契数

代码

py打表:

def get0(n):ans = 0for i in range(2**n):s = bin(i)[2:].zfill(n)for i in range(1, len(s)):if s[i] == '1' and s[i-1] == '1':ans += 1breakreturn ans
for i in range(1, 20):print(i, get0(i))

bm算法暴力过:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long ll;
typedef vector<int> VI;
const int maxn = 10005;
const ll mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const double eps = 1e-9;ll fast_mod(ll a, ll n, ll Mod)
{ll ans = 1;a %= Mod;while (n){if (n & 1)ans = (ans * a) % Mod;a = (a * a) % Mod;n >>= 1;}return ans;
}namespace linear_seq
{ll res[maxn], base[maxn], num[maxn], md[maxn]; //数组大小约10000
vector<int> vec;
void mul(ll *a, ll *b, int k)
{for (int i = 0; i < 2 * k; i++)num[i] = 0;for (int i = 0; i < k; i++){if (a[i])for (int j = 0; j < k; j++)num[i + j] = (num[i + j] + a[i] * b[j]) % mod;}for (int i = 2 * k - 1; i >= k; i--){if (num[i])for (int j = 0; j < vec.size(); j++)num[i - k + vec[j]] = (num[i - k + vec[j]] - num[i] * md[vec[j]]) % mod;}for (int i = 0; i < k; i++)a[i] = num[i];
}
ll solve(ll n, VI a, VI b)
{ll ans = 0, cnt = 0;int k = a.size();assert(a.size() == b.size());for (int i = 0; i < k; i++)md[k - 1 - i] = -a[i];md[k] = 1;vec.clear();for (int i = 0; i < k; i++)if (md[i])vec.push_back(i);for (int i = 0; i < k; i++)res[i] = base[i] = 0;res[0] = 1;while ((1LL << cnt) <= n)cnt++;for (int p = cnt; p >= 0; p--){mul(res, res, k);if ((n >> p) & 1){for (int i = k - 1; i >= 0; i--)res[i + 1] = res[i];res[0] = 0;for (int j = 0; j < vec.size(); j++)res[vec[j]] = (res[vec[j]] - res[k] * md[vec[j]]) % mod;}}for (int i = 0; i < k; i++)ans = (ans + res[i] * b[i]) % mod;if (ans < 0)ans += mod;return ans;
}
VI BM(VI s)
{VI B(1, 1), C(1, 1);int L = 0, m = 1, b = 1;for (int i = 0; i < s.size(); i++){ll d = 0;for (int j = 0; j < L + 1; j++)d = (d + (ll)C[j] * s[i - j]) % mod;if (d == 0)m++;else if (2 * L <= i){VI T = C;ll c = mod - d * fast_mod(b, mod - 2, mod) % mod;while (C.size() < B.size() + m)C.push_back(0);for (int j = 0; j < B.size(); j++)C[j + m] = (C[j + m] + c * B[j]) % mod;L = i + 1 - L, B = T, b = d, m = 1;}else{ll c = mod - d * fast_mod(b, mod - 2, mod) % mod;while (C.size() < B.size() + m)C.push_back(0);for (int j = 0; j < B.size(); j++)C[j + m] = (C[j + m] + c * B[j]) % mod;m++;}}return C;
}
int gao(VI a, ll n)
{VI c = BM(a);c.erase(c.begin());for (int i = 0; i < c.size(); i++)c[i] = (mod - c[i]) % mod;return solve(n, c, VI(a.begin(), a.begin() + c.size()));
}
} // namespace linear_seq
int main()
{ll t, n;scanf("%lld", &n);printf("%lld\n", linear_seq::gao(VI{0, 1, 3, 8, 19, 43, 94, 201, 423, 880}, n - 1));return 0;
}

找规律:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll a[110], b[110];
int main()
{ll n;scanf("%lld", &n);a[1] = 0, a[2] = 1, a[3] = 3;b[2] = 1, b[3] = 1;for (ll i = 4; i <= n; i++){b[i] = (b[i - 1] + b[i - 2]) % mod;a[i] = (a[i - 1] * 2 + b[i]) % mod;}printf("%lld\n", a[n]);return 0;
}

HihoCoder - 1318 非法二进制数(找规律,BM线性递推)相关推荐

  1. L. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛,ac自动机+矩阵快速幂 或 BM线性递推)

    描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells hi ...

  2. 杜教板子(BM) 线性递推式(板子)

    杜教板子(BM) 线性递推式 解决传统线性递推式神器 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath ...

  3. 【THUSC 2017】如果奇迹有颜色【polya引理】【矩阵】【计数dp】【BM打表+线性递推】

    题意:长度为 nnn 的环染 mmm 种颜色,要求任意相邻 mmm 个元素不能包含全部的颜色.求方案数 模 109+710^9+7109+7,循环同构. n≤109,m≤7n\leq 10^9,m\l ...

  4. [线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程

    线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0​,a1​,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r ...

  5. hiho 1318 非法二进制数 dp

    #1318 : 非法二进制数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的. 小Hi想知道在所有 n 位 ...

  6. 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)

    这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...

  7. BM求线性递推模板(杜教版)

    BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...

  8. BM算法(Berlekamp-Massey算法):解决线性递推问题

    算法内容 Berlekamp-Massey算法,常简称为BM算法,是用来求解一个数列的最短线性递推式的算法. BM算法可以在O(N2)的时间内求解一个长度为N的数列的最短线性递推式. 算法模板 取模, ...

  9. 线性递推数列_学习笔记

    前置知识:线代基础(越多越好 发现了一位老哥写的笔记,精炼得相当到位 (这是博客地址嗷) . 线性递推数列 基本性质 定理1.1. 对于无限数列 { a 0 , a 1 , a 2 . . . } \ ...

最新文章

  1. Oracle --获取绑定变量的值.
  2. 用c语言按颜色对图像进行分类,【leetcode C语言实现】75_颜色分类
  3. virtualbox调试linux内核,virtualbox+kgdbt调试linux内核
  4. jumpserver-v2.9.2离线安装
  5. P4782-[模板]2-SAT问题【tarjan】
  6. php1045无法登录mysql_phpstudy安装完成后打开phpmyadmin提示#1045 无法登录 MySQL 服务器...
  7. Android版本Oppo电视,OPPO 智能电视 R1
  8. JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
  9. 浅谈SpringMVC之DispatcherServlet
  10. 维纳滤波——Wiener Filter(一些理解)
  11. Listen1 - 让你畅享全网音乐!你值得拥有!
  12. 1688如何做视频外链
  13. html -----硬回车和软回车
  14. STM32 LoRaWAN探索板B-L072Z-LRWAN1入门指南
  15. 烦人的弹窗Placing the unmodified “important.txt“ in the zip file with the agent jar in the same
  16. 【射影几何01】 射影几何介绍
  17. 巴拿赫空间的基本性质
  18. 这些中国顶级黑客带来的价值远比负面影响多!
  19. 【雅思大作文考官范文】——第十八篇:“problem and solution essay”
  20. python计算协方差矩阵_在Python中构建协方差矩阵

热门文章

  1. 谷歌hotel finder结果融入到页面搜索
  2. 用友从“新”出发:“新”在哪里?
  3. 用facenet源码进行人脸识别测试过程中的一些问题
  4. win10安装ubuntu-GNOME双系统踩坑综合
  5. 正则表达式验证邮箱格式
  6. 量纲与无量纲、标准化、归一化、正则化【能够帮助梯度下降中学习进度收敛的更快、提升模型的收敛速度提升模型的精度、防止模型过拟合,提高模型的泛化能力】
  7. 设计模式之门面模式与装饰器模式详解和应用
  8. 燃气热水器的主要部件及维修常识
  9. primary计算机英语,模拟试题1_计算机专业英语_doc_大学课件预览_高等教育资讯网...
  10. vert.x笔记:4.vert.x中调用spring服务