Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二
Integer Partition
Following are T lines. Each line contains two numbers, n and k.
1<=n,k,T<=105
Since the numbers can be very large, you should output them modulo 109+7.
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4658

用了五边形数定理以及生成函数,然而我看懂了生成函数怎么搞这题却不知道为啥生成函数是五边形数形式= =
首先观察下面的图片:
很容易我们可以发现用这种方式构造N个五边形(假设一个点也算一个五边形),需要点的个数为:
接下来我们来看一下数拆分。
提问:将一个正整数N拆成不少于一个数的和,问有多少种方案。
很容易我们可以构造一个多项式:
P(x)=(1+x1+x2+...)(1+x2+x4+...)(1+x3+x6+...)...
=Px(0)x0+Px(1)x1+Px(2)x2+...+Px(n)xn
可以发现N的数拆分的方案数正对应着多项式展开后xn的系数Px(n)
考虑如下等式:
因此我们有:
其中上式等式左边是欧拉函数ϕ(x)的倒数。即:
欧拉函数ϕ(x)的展开式为:
其中的x的指数正对应着广义五边形数!
| n | 0 | 1 | -1 | 2 | -2 | 3 | -3 | 4 | -4 | … |
|---|---|---|---|---|---|---|---|---|---|---|
| P(n) | 0 | 1 | 2 | 5 | 7 | 12 | 15 | 22 | 26 | … |
现在我们要计算Px(n),由于1ϕ(x)=P(x),亦即ϕ(x)P(x)=1。
所以:Px(n)=Px(n−1)+Px(n−2)−Px(n−5)−Px(n−7)+...
由于对于满足i(3i−1)2≤n的i的个数不超过(√n)个,于是计算所有Px(n)的复杂度为O(n(√n))
上面我们说明的是不带限制的数拆分,现在我们给定一个限制:拆分出来的每种数的个数不能大于等于k(这也是本题的要求)。
类似的,我们考虑生成函数:
展开ϕ(xk)得:
然后可得:
令Fk(n)表示n的满足数拆分时每种数的个数小于等于k的数拆分方案数。则有:

寻找&星空の孩子#include<iostream>
#include<cstdio>
#define NN 100005
#define LL __int64
#define mod 1000000007 using namespace std;
LL wu[NN],pa[NN];
void init()
{
pa[]=;
pa[]=;
pa[]=;
pa[]=;
LL ca=;
for(LL i=; i<=/; i++)
{
wu[ca++]=i*(*i-)/;
wu[ca++]=i*(*i+)/;
if(wu[ca-]>) break;
}
for(LL i=; i<=; i++)
{
pa[i]=(pa[i-]+pa[i-])%mod;
ca=;
while(wu[*ca]<=i)
{
if(ca&)
{
pa[i]=(pa[i]-pa[i-wu[*ca]]);
pa[i]=(pa[i]%mod+mod)%mod;
if(wu[*ca+]<=i)
pa[i]=(pa[i]-pa[i-wu[*ca+]]),pa[i]=(pa[i]%mod+mod)%mod;
}
else
{
pa[i]=(pa[i]+pa[i-wu[*ca]]);
pa[i]=(pa[i]%mod+mod)%mod;
if(wu[*ca+]<=i)
pa[i]=(pa[i]+pa[i-wu[*ca+]]),pa[i]=(pa[i]%mod+mod)%mod;
}
ca++;
}
}
}
LL work(int n,int k)
{
LL ans=pa[n];
LL ca=;
while(k*wu[*ca]<=n)
{
if(ca&)
{
ans=(ans+pa[n-k*wu[*ca]]);
ans=(ans%mod+mod)%mod;
if(k*wu[*ca+]<=n)
ans=(ans+pa[n-k*wu[*ca+]]),ans=(ans%mod+mod)%mod;
}
else
{
ans=(ans-pa[n-k*wu[*ca]]);
ans=(ans%mod+mod)%mod;
if(k*wu[*ca+]<=n)
ans=(ans-pa[n-k*wu[*ca+]]),ans=(ans%mod+mod)%mod;
}
ca++;
}
return ans;
}
int main()
{
int T,n,k;
init();
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
printf("%I64d\n",work(n,k));
}
return ; }
Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二的更多相关文章
- Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)
Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 4658 Integer Partition (2013多校6 1004题)
Integer Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Partition(hdu4651)2013 Multi-University Training Contest 5
Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 2018 Multi-University Training Contest 1 Triangle Partition 【YY】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6300 Triangle Partition Time Limit: 2000/1000 MS (Java ...
- 2013 Multi-University Training Contest 6
HDU-4655 Cut Pieces 题意:有N个格子能够被涂色,每个格子能够涂1-ai 种颜色,当N=6,涂色方案:112233 认为方案中共有3个颜色块:涂色方案:121212 认为方案中共有6 ...
- ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków
ACM ICPC Central Europe Regional Contest 2013 Jagiellonian University Kraków Problem A: Rubik’s Rect ...
- JSU 2013 Summer Individual Ranking Contest - 5
JSU 2013 Summer Individual Ranking Contest - 5 密码:本套题选题权归JSU所有,需要密码请联系(http://blog.csdn.net/yew1eb). ...
- HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/500 ...
随机推荐
- 11g直接路径读、相关参数、10949事件介绍
转载自刘向兵老师:http://www.askmaclean.com/archives/11g-direct-path-read-10949-_small_table_threshold-_seria ...
- 从构建分布式秒杀系统聊聊WebSocket推送通知
秒杀架构到后期,我们采用了消息队列的形式实现抢购逻辑,那么之前抛出过这样一个问题:消息队列异步处理完每个用户请求后,如何通知给相应用户秒杀成功? 场景映射 首先,我们举一个生活中比较常见的例子:我们去 ...
- Java 多线程之悲观锁与乐观锁
一.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源 ...
- 三、activiti工作流-流程设计工具
首先在diagrams下面新建一个文件夹 然后在这个文件夹下new一个Activiti Diagram new好后出现bpmn文件, 可以通过右键以xml方式打开bpmn文件查看源码 双击打开文件然后 ...
- AI - 参考消息(References)
01 - Machine learning infographic 图片解读机器学习的基本概念.五大流派与九种常见算法 EN:http://usblogs.pwc.com/emerging-techn ...
- 告诉你,Spring Boot 真是个牛逼货!
现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下. Spring Boot ...
- 《CLR Via C#》读书笔记:24.运行时序列化
一.什么是运行时序列化 序列化的作用就是将对象图(特定时间点的对象连接图)转换为字节流,这样这些对象图就可以在文件系统/网络进行传输. 二.序列化/反序列化快速入门 一般来说我们通过 FCL 提供的 ...
- 浅谈模块系统与 ABP 框架初始化
在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...
- .NET Core 获取 HttpContext.Current 以及 AsyncLocal 与 ThreadLocal
在 DotNetCore 当中不再像 MVC5 那样可以通过 HttpContext.Current 来获取到当前请求的上下文. 不过微软提供了一个 IHttpContextAccessor 来让我们 ...
- Redis(2)---数据持久化
数据持久化 Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) (1)RDB持久化方式是在一个特定的间隔保存某个时间点的一个数据快照.(默认模式) (2)以日志的形式来记录每个 ...