Codeforces 414B 统计dp
来源:互联网 发布:ubuntu如何卸载jdk 编辑:程序博客网 时间:2024/06/04 17:39
题目链接:点击打开链接
题意:
寻找一种序列;
1 <= b1 <= b2 <= b3 <= ... <= bm <= n;
并且 bi 要整除 b(i + 1);
即:bi | b(i + 1);
给一个 n 和 k;
问在 n 这个范围内,能求出的多少种满足条件的 k 这么长的序列;
理解:
想到了一个 n^3 的方法;
递推式差不多;
但是会超时;
神说是统计 dp;
要优化;
于是从另一个方向推;
递推式含义为:dp[i][j] 表示长度为 j 的末尾为 i 的种数;
递推式为:dp[i][j] = sigma(dp[k][j - 1]);
其中,k 是 i 的倍数;
直接枚举找倍数会超时的;
所以需要一些技巧;
代码如下:
#include <cstdio>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <vector>#include <string>#include <map>#include <set>#include <queue>#include <stack>using namespace std;typedef long long LL;typedef pair<int, int> PII;const int MIN_INF = 1e-7;const int MAX_INF = (1e9) + 7;#define X first#define Y secondint dp[2222][2222]; //dp[i][j] 表示长度为 j 的末尾为 i 的种数int main() { int n, m; cin >> n >> m; for (int i = 0; i <= n; ++i) { dp[i][1] = 1; } for (int j = 1; j <= m; ++j) { for (int i = 1; i <= n; ++i) { for (int p = i; p <= n; p += i) { //此处的值都为 i 的倍数 dp[p][j + 1] = (dp[p][j + 1] + dp[i][j]) % MAX_INF; } } } int ans = 0; for (int i = 1; i <= n; ++i) { ans = (ans + dp[i][m]) % MAX_INF; } cout << ans << endl; return 0;}
0 0
- Codeforces 414B 统计dp
- codeforces 414B (DP)
- codeforces 414b(数位DP)
- CodeForces 414B--Mashmokh and ACM (dp)
- Mashmokh and ACM - CodeForces 414B dp
- 【dp】 Codeforces 2B
- Codeforces 2B (DP)
- CodeForces 407B DP
- Codeforces - 577B dp
- codeforces 587B(dp)
- Codeforces 679B - dp
- Codeforces 577B(dp)
- codeforces 855B DP
- 字符串dp codeforces B
- codeforces 414B B. Mashmokh and ACM(dp)
- codeforces 240B - Fence DP
- Codeforces 258B 数位DP
- DP 之 codeforces 416B
- iOS- 单利了解
- docker操作mysql
- 传统的JavaScript实现的Ajax 与 JQuery封装的Ajax
- 堆、栈与队列
- Android ANR 分析解决方法
- Codeforces 414B 统计dp
- Linux(CentOS)+SVN服务器,并实现本地提交后,服务器端自动更新
- leetcode 328. Odd Even Linked List 解题报告
- Spring集成Redis使用注解
- sql中实现split()功能
- 数据结构实验之串一:KMP简单应用
- 表格合并---课程表
- Android源码工程转化为Android Studio项目的方法
- solr5.X的几个重要配置模板