1 条题解
-
0
题意
将每个字符串表示为二进制串(用 和 代替红白花)。一个字符串是“好”的,当且仅当每个由连续 组成的极长子串的长度都能被 整除。
思路
使用动态规划求解。定义 表示长度为 的好字符串的数量。
- 如果第 个字符是 ,则前面的字符可以任意,因此方案数为 。
- 如果第 个字符是 ,则它必须与前面的 个 连续出现,因此方案数为 。
于是得到递推式:
算法步骤
- 预处理 数组,长度为最大可能的 (记为 )。
- 计算前缀和 。
- 对于每个询问 ,答案为 。
复杂度分析
- 时间复杂度:,其中 是所有 的最大值, 是询问次数。
- 空间复杂度:。
代码说明
- 先读入 和 ,以及所有询问,找出最大的 。
- 初始化 ,然后按递推式计算 到 。
- 计算前缀和数组 。
- 对每个询问输出 。
#include<bits/stdc++.h> using namespace std; #define PF 1000000007 #define MAXN 100005 long long n,k,f[MAXN]={0},s[MAXN]={0},a,b; //long long int main(){ cin>>n>>k; f[0]=1;//初始化 for(int i=1;i<=MAXN;i++) { //dp f[i]+=f[i-1]%PF; if(i>=k)f[i]+=f[i-k]%PF; s[i]=(s[i-1]+f[i])%PF; //前缀和 } for(int i=1;i<=n;i++) { cin>>a>>b; cout<<(s[b]-s[a-1]+PF)%PF<<endl; //输出 } }
- 1
信息
- ID
- 6728
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者