题解 [ABC132F] Small Products
时间:2020-03-24
本文章向大家介绍题解 [ABC132F] Small Products,主要包括题解 [ABC132F] Small Products使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
给定 \(N\), \(K\),问有多少个长度为 \(K\) 的正整数序列满足相邻元素的乘积不超过 \(N\)。
正解
考虑递推,设 \(f_{i,j}\) 表示第 \(i\) 个位置填 \(j\) 的方案数。
然而值域实在太大,要将所有数存下来实在不太可行。
考虑有哪些状态本质上是相同的。
序列中一个元素 \(a_i\),可以转移到下一个位置 \(a_{i + 1} \leq \lfloor N / a_i \rfloor\),发现 \(\lfloor N / a_i \rfloor\) 只有 \(\sqrt N\) 种取值,可以直接记录下来。
那么将 \(a_i \le \sqrt N\),\(a_i > \sqrt N\) 分别记录即可。
转移要用前缀和优化一下,实现的时候可以从大往小枚举记录前缀和 / 后缀和。
时间复杂度 \(O(K \sqrt N)\)
\(\color{DeepSkyBlue} {Code :}\)
#include <bits/stdc++.h>
#define N 105
#define V 31627
using namespace std;
const int mod = 1e9 + 7;
int n, K;
int f[N][V], g[N][V];
int cnt[V];
int main() {
scanf("%d %d", &K, &n); /* 把 n, k 的定义反了一下*/
int p = sqrt(K);
for(int i = 1; i < p; ++i)
cnt[i] = K / i - K / (i + 1);
cnt[p] = K / p - p;
for(int i = 1; i <= p; ++i) {
f[1][i] = 1;
g[1][i] = cnt[i];
}
for(int i = 1; i <= n; ++i) {
int sum = 0;
for(int j = 1; j <= p; ++j) {
sum = (sum + f[i][j]) % mod;
g[i + 1][j] = 1LL * sum * cnt[j] % mod;
}
for(int j = p; j >= 1; --j) {
sum = (sum + g[i][j]) % mod;
f[i + 1][j] = sum;
}
}
printf("%d\n", f[n + 1][1]);
return 0;
}
原文地址:https://www.cnblogs.com/Lskkkno1/p/12561028.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 客户决策 | 我的代码没有else
- LeetCode 1595 Minimum Cost to Connect Two Groups of Points (动态规划)
- js DOM系统
- css的radial-gradient大详解
- 你想知道的优惠券业务,SkrShop告诉你
- js汇率计算器系统
- 数学--数论--欧拉降幂和广义欧拉降幂(实用好理解)
- JS逐步教你做(自己版本)的视频播放器(我先声明,step我不懂是什么意思,所以没用)
- 【mysql系列】细谈“explain”之理论Part
- 如果用java swing编写一个五子棋(人人对战)
- 【mysql系列】细谈explain执行计划之“谜”
- 洛谷 P1352 没有上司的舞会(树形 DP)
- CF思维联系– CodeForces - 991C Candies(二分)
- 洛谷P1122 最大子树和 树形DP初步
- JAVA_WEB--jsp语法