Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二
来源:互联网 发布:pk10网站源码 编辑:程序博客网 时间:2024/06/01 08:26
Integer Partition
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 524 Accepted Submission(s): 238
Problem Description
Given n, k, calculate the number of different (unordered) partitions of n such that no part is repeated k or more times.
Input
First line, number of test cases, T.
Following are T lines. Each line contains two numbers, n and k.
1<=n,k,T<=105
Following are T lines. Each line contains two numbers, n and k.
1<=n,k,T<=105
Output
T lines, each line contains answer to the responding test case.
Since the numbers can be very large, you should output them modulo 109+7.
Since the numbers can be very large, you should output them modulo 109+7.
Sample Input
44 24 34 44 5
Sample Output
2445
Source
2013 Multi-University Training Contest 6
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4658
题意:问一个数n能被拆分成多少种方法,且每一种方法里数字重复个数不能超过k(等于k)。
五边形数定理续,结合上一题(hdu4651),先打表,然后把大于k的个数剪掉;
好吧,再啰嗦一遍:
用了五边形数定理以及生成函数,然而我看懂了生成函数怎么搞这题却不知道为啥生成函数是五边形数形式= =
首先观察下面的图片:
很容易我们可以发现用这种方式构造N个五边形(假设一个点也算一个五边形),需要点的个数为:
接下来我们来看一下数拆分。
提问:将一个正整数
很容易我们可以构造一个多项式:
可以发现N的数拆分的方案数正对应着多项式展开后
考虑如下等式:
因此我们有:
其中上式等式左边是欧拉函数
欧拉函数
其中的x的指数正对应着广义五边形数!
现在我们要计算
所以:
由于对于满足
上面我们说明的是不带限制的数拆分,现在我们给定一个限制:拆分出来的每种数的个数不能大于等于k(这也是本题的要求)。
类似的,我们考虑生成函数:
展开
然后可得:
令
一开始超时了,不然把取余的部分修改了下就过了。。。
卡过啊!
转载请注明出处:http://blog.csdn.net/u010579068
#include<iostream>#include<cstdio>#define NN 100005#define LL __int64#define mod 1000000007using namespace std;LL wu[NN],pa[NN];void init(){ pa[0]=1; pa[1]=1; pa[2]=2; pa[3]=3; LL ca=0; for(LL i=1; i<=100000/2; i++) { wu[ca++]=i*(3*i-1)/2; wu[ca++]=i*(3*i+1)/2; if(wu[ca-1]>100000) break; } for(LL i=4; i<=100000; i++) { pa[i]=(pa[i-1]+pa[i-2])%mod; ca=1; while(wu[2*ca]<=i) { if(ca&1) { pa[i]=(pa[i]-pa[i-wu[2*ca]]); pa[i]=(pa[i]%mod+mod)%mod; if(wu[2*ca+1]<=i) pa[i]=(pa[i]-pa[i-wu[2*ca+1]]),pa[i]=(pa[i]%mod+mod)%mod; } else { pa[i]=(pa[i]+pa[i-wu[2*ca]]); pa[i]=(pa[i]%mod+mod)%mod; if(wu[2*ca+1]<=i) pa[i]=(pa[i]+pa[i-wu[2*ca+1]]),pa[i]=(pa[i]%mod+mod)%mod; } ca++; } }}LL work(int n,int k){ LL ans=pa[n]; LL ca=0; while(k*wu[2*ca]<=n) { if(ca&1) { ans=(ans+pa[n-k*wu[2*ca]]); ans=(ans%mod+mod)%mod; if(k*wu[2*ca+1]<=n) ans=(ans+pa[n-k*wu[2*ca+1]]),ans=(ans%mod+mod)%mod; } else { ans=(ans-pa[n-k*wu[2*ca]]); ans=(ans%mod+mod)%mod; if(k*wu[2*ca+1]<=n) ans=(ans-pa[n-k*wu[2*ca+1]]),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 0;}
0 0
- Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二
- Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)
- 2013 Multi-University Training Contest 6
- hdu 4638 Group(2013 Multi-University Training Contest 4)
- 2013 Multi-University Training Contest 1
- 2013 Multi-University Training Contest 1
- 2013 Multi-University Training Contest 2
- 2013 Multi-University Training Contest 1
- 2013 Multi-University Training Contest 1
- 2013 Multi-University Training Contest 3
- 2013 Multi-University Training Contest 3
- 2013 Multi-University Training Contest 4
- 2013 Multi-University Training Contest 5
- 2013 Multi-University Training Contest 7
- 2013 Multi-University Training Contest 8
- 2013 Multi-University Training Contest 8 小结
- 2013 Multi-University Training Contest 9
- 2013 Multi-University Training Contest 10
- win8.1下无法运行vc++6.0的解决方法
- 关于CentOS网络连接问题及第三天实习收获
- python中的input函数和raw_input函数的区别
- 二叉树的前序、中序、后序、层序遍历
- Kaprekar数
- Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二
- MySQL存储引擎总结
- HQL和SQL的区别
- Java 内存分配全面浅析
- android LayoutInflater 的使用
- QTreeWidget样式设置大全(一)
- js 写一个table
- iOS 8 自适应 Cell
- Unity3D表面着色器(Surface Shader)资料整合