http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1259

1259 整数划分 V2

基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
收藏
关注
将N分为若干个整数的和,有多少种不同的划分方式,例如:n = 4,{4}  {1,3}  {2,2}  {1,1,2} {1,1,1,1},共5种。由于数据较大,输出Mod 10^9 + 7的结果即可。
Input
输入1个数N(1 <= N <= 50000)。
Output
输出划分的数量Mod 10^9 + 7。
Input示例
4
Output示例
5

  与1201相似但是允许出现重复的数,如果还按照1201的写法,复杂度就是平方级了,看了讨论的解法感觉很巧妙。
利用分块将数据分成了[1,sqrt(n)],[sqrt(n)+1,n]两部分,分别用f[i][j]和g[i][j]表示用区间内的数j个组合成和为i的数的方案个数,计算f时无限背包,计算g时使用1201的
方程计算(注意这里的区间最小的值是sqrt(n+1))。最后用乘法原理计算答案ans=SUM{f[n][i]*h[n-i]},其中0<=i<=n,h[i]表示g[i][..]的总和。注意乘法时候会爆int使用longlong就好了。
 #include<bits/stdc++.h>
using namespace std;
const int mod=1e9+;
#define LL long long
int f[],g[][];
int main()
{
int n,i,j,k;
cin>>n;
f[]=;
int m=sqrt(n*1.0);
for(i=;i<=m;++i)
for(j=i;j<=n;++j)
f[j]=(f[j]+f[j-i])%mod; g[][]=;
g[m+][]=;
for(i=m+;i<=n;++i)
{
int k=i/(m+);
for(j=;j<=k;++j)
{
if(i+j<=n){
g[i+j][j]=(g[i+j][j]+g[i][j])%mod;
}
if(i+m+<=n){
g[i+m+][j+]=(g[i+m+][j+]+g[i][j])%mod;
}
g[i][]=(g[i][]+g[i][j])%mod;
}
}
LL ans=;
for(i=;i<=n;++i)
ans=(ans+(LL)f[i]*g[n-i][]%mod)%mod;
cout<<ans<<endl;
return ;
}

51nod-1259-分块+dp的更多相关文章

  1. Codeforces Round #278 (Div. 1) D - Conveyor Belts 分块+dp

    D - Conveyor Belts 思路:分块dp, 对于修改将对应的块再dp一次. #include<bits/stdc++.h> #define LL long long #defi ...

  2. 51nod 1183 编辑距离(dp)

    题目链接:51nod 1183 编辑距离 #include<cstdio> #include<cstring> #include<algorithm> using ...

  3. CF1129D Isolation(分块+DP)

    一个很显然的DP方程式:f[i]=Σf[j],其中j<i且在[j+1,i]中出现1次的数不超过k个 乍一看挺神仙的,只会O(n^2),就是对于每个位置从后向前扫一遍,边扫边统计出现1次的数的个数 ...

  4. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

  5. 51nod 1043 数位dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 1043 幸运号码 基准时间限制:1 秒 空间限制:131072 ...

  6. 51nod 1042 数位dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131 ...

  7. 51nod 1009 数位dp入门

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 数字1的数量 基准时间限制:1 秒 空间限制:13107 ...

  8. 51nod 1503 多线程dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 1503 猪和回文 题目来源: CodeForces 基准时间限制 ...

  9. [CSP-S模拟测试]:旅行计划(分块+DP)

    题目传送门(内部题83) 输入格式 第一行两个整数$n,m$ 接下来$m$行,每行三个整数,$u,v,w$,表示从$u$到$v$有一条权值为$w$的边 接下来一行有一个整数$q$,表示$q$天 接下来 ...

  10. 51NOD 1705 七星剑 [DP 期望的线性性质]

    传送门 题意: 七颗星,第$i$课星用第$j$个宝石有$p[i][j]$的概率成功,失败将为$g[i][j]$颗星: 第$j$个宝石化费$c[j]$ 求最小期望化费 $MD$本来自己思路挺对的看了半天 ...

随机推荐

  1. python类的相关知识第一部分

    一.类的相关概念 (1).什么是类 具有同种属性的对象称为类,是个抽象的概念.比如说:汽车.人.狗.神: (2).什么是对象或实例 日常生活中的所有东西都是对象,是类的实例化.比如说:推土车是汽车的实 ...

  2. Java 之 Servlet

    JavaWeb 三大组件: Servlet, Filter, Listener. Servlet 的作用是处理请求,服务器会把接收到的请求交给 Servlet 来处理.在 Servlet 中通常需要: ...

  3. python3 基础数据类型

    一.基础数据类型分类 python的数据类型主要包括以下几种: 1.数字 2.字符串 3.列表 4.字典 5.元组 6.集合 1.数字 int 数字主要是用于计算用的,使用方法并不多 #bit_len ...

  4. python数据类型一(重点是字符串的各种操作)

    一.python基本数据类型 1,int,整数,主要用来进行数学运算 2,bool,布尔类型,判断真假,True,False 3,str,字符串,可以保存少量数据并进行相应的操作(未来使用频率最高的一 ...

  5. loadrunner winsocket sent buffer 乱码

    data.ws里手写的xml参数,调试脚本时一直显示乱码,解决方法如下: tools-recording options--sockets--winsock下: EBCID--translation ...

  6. 解决hash冲突的办法

    1.开发定址法 2.再哈希法 3.链地址法 4.建立一个公共溢出区

  7. 75. Sort Colors(荷兰国旗问题 三指针)

      Given an array with n objects colored red, white or blue, sort them so that objects of the same co ...

  8. datagrid 用法

    http://blog.csdn.net/xhhuang1979/article/details/8331682

  9. DateTable To Json

    private string aaaa(DataTable dt) { JavaScriptSerializer javaScriptSerializer = new JavaScriptSerial ...

  10. Python数据处理实例

    使用python进行数据处理的实例(数据为某公司HR部门关于员工信息的部分摘录,kaggle上面的一次赛题) https://www.kaggle.com/c/kfru-dbm-hr-analytic ...