[bzoj5472] 数列
Description
输入一个长度为n的数组{ai}(1 <= i <= n)
问有多少个长度为n的数组{xi}(1 <= i <= n),满足1 <= xi <= ai。
并且相邻两项的最大公约数小于等于k。
换句话说,对于1<i <= n,满足gcd(xi−1,xi) <= k。
问这样的数组{xi}有多少个,答案对1000000007取模。
Input
第一行两个整数n,k。接下来一行n个整数,表示数组{ai}。
1 <= ai,k <= 1000000。Sigma(ai) <= 1000000。
Output
一行一个整数表示这样的数组的个数,对1000000007取模。
Sample Input
9 2
1 2 3 4 5 6 7 8 9
Sample Output
168852
Solution
考虑\(dp\),
设\(f_{i,j}\)表示当前选到第\(i\)个数了,这个数选的是\(j\)。
显然可以得到转移:
\]
这个是\(O(n^2)\)的,不能接受,考虑针对后面的\(\gcd\)化简式子,莫比乌斯反演一波可以得到:
\]
中间都是一些套路的化简,这里不赘述了。
然后设:
\]
这个可以\(O(n\log n)\)预处理出来。
设:
\]
这个每次转移都是\(O(lim\cdot \log lim)\),总复杂度\(O(n\log n)\)。
所以转移可以写成这样:
\]
这个可以枚举约数\(O(n\log n)\)。
所以,总复杂度为\(O(n\log n)\)。
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
const int maxn = 2e6+10;
vector <int > f[maxn];
int g[maxn],mu[maxn],pri[maxn],tot,vis[maxn],k,n,lim[maxn],h[maxn],G[maxn];
void sieve() {
mu[1]=1;
for(int i=2;i<maxn;i++) {
if(!vis[i]) pri[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*pri[j]<maxn;j++) {
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
mu[i*pri[j]]=-mu[i];
}
}
for(int t=1;t<maxn;t++)
for(int d=t;d<maxn&&d<=k*t;d+=t) g[d]+=mu[t];
}
int main() {
read(n),read(k);
sieve();
for(int i=1;i<=n;i++) {
read(lim[i]);
for(int j=0;j<=lim[i]+1;j++) f[i].push_back(0);
}
for(int i=1;i<=lim[1];i++) f[1][i]=1;
for(int i=2;i<=n;i++) {
for(int j=1;j<=lim[i];j++) h[j]=0; // ATTENTION lim[i] !
for(int j=1;j<=lim[i-1];j++)
for(int u=j;u<=lim[i-1];u+=j) h[j]=(h[j]+f[i-1][u])%mod;
for(int t=1;t<=lim[i];t++)
for(int d=t;d<=lim[i];d+=t)
f[i][d]=(1ll*f[i][d]+1ll*h[t]*g[t]%mod)%mod;
}
int ans=0;
for(int i=1;i<=lim[n];i++) ans=(ans+f[n][i])%mod;
write((ans%mod+mod)%mod);
return 0;
}
[bzoj5472] 数列的更多相关文章
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- PAT 1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- fibonacci数列(五种)
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 洛谷 P1182 数列分段Section II Label:贪心
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 代码的坏味道(4)——过长参数列(Long Parameter List)
坏味道--过长参数列(Long Parameter List) 特征 一个函数有超过3.4个入参. 问题原因 过长参数列可能是将多个算法并到一个函数中时发生的.函数中的入参可以用来控制最终选用哪个算法 ...
随机推荐
- 写给iOS小白的MVVM教程(序)
这几天,需要重构下部分代码,这里简要记录下.但是涉及的技术要点还是很多,所以分为多个篇章叙述.此教程来源于,并将于应用于实践,不做过多的概念性阐释和争论.每个篇章都会附上实际的可执行的代码.因涉及的技 ...
- Easyui下的点击回车键跳转到下个控件
在Easyui框架下,JavaScript 中的 onKeyDown事件居然失效了.所以使用了另外的函数去实现点击回车键跳转到下个控件. /** * 点击回车键跳转到下个控件; * @param ol ...
- 爬虫学习(十一)——bs4基础学习
ba4的介绍: bs4是第三方提供的库,可以将网页生成一个对象,这个网页对象有一些函数和属性,可以快捷的获取网页中的内容和标签 lxml的介绍 lxml是一个文件的解释器,python自带的解释器是: ...
- Mac中Mysql开启远程访问(不同于linux直接改配置文件)
在mac中安装Mysql Workbench 用root用户连上安装的Mysql. 开启远程访问的服务 如下图可以看到是root用户绑定的是localhost 如果不做修改的话,直接访问是访问不了 ...
- idea中自定义设置xml的头文件的内容
因为在idea中新建的xml默认的头文件,有时候并不是我们需要的这时候可以通过自定义来解决. 如搭建hibernate的实体类的映射xml. 首先 fiel→settings出现 如下框框 在上面搜索 ...
- 面向对象特性 - php
1.类的字段调用格式 公用字段 类内调用 $this->字段名 类外调用 $对象名->字段名 静态 类内调用 self::$字段名 类外调用 类名::$字段名 常量 类内调用 ...
- 13-在Core Mvc中使用Options
配制文件appsettings和Classes来自12节 在HomeController增加如下代码,使用IOption方式进行注入 public class HomeController : Con ...
- 笔记-mysql-管理及基础操作
笔记-mysql使用-管理及基础操作 1. 简介 mysql是一个免费的关系型数据库,不过好像被oracle收购了.... 希望它继续免费. 1.1. 相关术语 数据库,表,列,行,冗 ...
- 大话CNN经典模型:VGGNet
2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络:VGGNet,并取得了ILSVRC20 ...
- PHP.29-TP框架商城应用实例-后台6-商品会员添加-价格、级别
首先把需求分析搞清楚 主要实现两个功能 1.会员管理,设置成为会员的要求 2.添加商品时,可设置会员优惠价格 具体实现 1.建表[会员级别限定表p39_member_level{Id,级别名称,积分下 ...