下面内容摘自维基百科:

五边形数定理[编辑]

五边形数定理是一个由欧拉发现的数学定理,描写叙述欧拉函数展开式的特性[1] [2]。欧拉函数的展开式例如以下:

亦即

欧拉函数展开后,有些次方项被消去,仅仅留下次方项为1, 2, 5, 7, 12, ...的项次,留下来的次方恰为广义五边形数。

当中符号为- - + + - - + + .....

若将上式视为幂级数,其收敛半径为1,只是若仅仅是当作形式幂级数(formal
power series
)来考虑,就不会考虑其收敛半径。

和切割函数的关系

欧拉函数的倒数是切割函数的母函数,亦即:

当中为k的切割函数。

上式配合五边形数定理,能够得到

考虑项的系数,在
n>0 时,等式右側的系数均为0,比較等式二側的系数,可得

因此可得到切割函数p(n)的递归式

以n=10为例

知道这个定理的话,hdu 4651就能够直接套模板了
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define MP make_pair
#define LL long long
#define CLR(a, b) memset(a, b, sizeof(a)) using namespace std; const int maxn = 100100;
const int INF = 0x3f3f3f3f;
const LL MOD = 1000000007; int fiv[maxn];
LL p[maxn]; void init()
{
int tot = 1;
for(int i = 1; fiv[tot - 1] < maxn; i ++)///五边形数
{
fiv[tot ++] = i*(3*i-1)/2;
fiv[tot ++] = i*(3*i+1)/2;
}
p[0] = 1;
for(int i = 1; i < maxn; i ++)///i的切割数p(i)
{
p[i] = 0;int flag = 1;
for(int j = 1; ; j ++)
{
if(fiv[j] <= i)
{
p[i] += flag * p[i - fiv[j]];
p[i] = (p[i] % MOD + MOD) % MOD;
}
else break;
if(j % 2 == 0) flag = -flag;
}
}
} int main()
{
int T, n;
init();
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
printf("%lld\n", p[n]);
}
}

hdu 4651 Partition (利用五边形定理求解切割数)的更多相关文章

  1. hdu 4651 Partition(整数拆分+五边形数)

    Partition Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. hdu - 4651 - Partition

    题意:把一个整数N(1 <= N <= 100000)拆分不超过N的正整数相加,有多少种拆法. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid ...

  3. hdu 4651 Partition && hdu 4658 Integer Partition——拆分数与五边形定理

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4651 参考:https://blog.csdn.net/u013007900/article/detail ...

  4. hdu 4651 - Partition(五边形数定理)

    定理详见维基百科....http://zh.wikipedia.org/wiki/%E4%BA%94%E9%82%8A%E5%BD%A2%E6%95%B8%E5%AE%9A%E7%90%86 代码如下 ...

  5. HDU 4651 Partition(整数拆分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){    f[0 ...

  6. HDU 4651 Partition 整数划分,可重复情况

    Partition Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. HDU 4651 (生成函数)

    HDU 4651 Partition Problem : n的整数划分方案数.(n <= 100008) Solution : 参考资料: 五角数 欧拉函数 五边形数定理 整数划分 一份详细的题 ...

  8. 利用JavaScript打印出Fibonacci数(不使用全局变量)

    从汤姆大叔的博客里看到了6个基础题目:本篇是第4题 - 利用JavaScript打印出Fibonacci数(不使用全局变量) 解题关键: 1.Fibonacci数列的规律 2.递归 解点1:Fibon ...

  9. 回数是指从左向右读和从右向左读都是一样的数,例如 12321 , 909 。请利用 filter() 滤掉非回数

    不管在什么地方,什么时候,学习是快速提升自己的能力的一种体现!!!!!!!!!!! 最近一段时间学习了廖雪峰老师学的Python学习资料,给自己的帮助很大,同时也学到的了很多,今天做了一道练习题,对于 ...

随机推荐

  1. iOS - 发送邮件

    IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController.借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能. ...

  2. 五子棋-b

    五子棋是程序猿比较熟悉的一款小游戏,相信很多人大学时期就用多种语言写过五子棋小游戏.笔者工作闲暇之余,试着用OC实现了一下,在这里给大家分享一下.有不足之处,欢迎大家提供建议和指点!!!GitHub源 ...

  3. 浅析PC机串口通讯流控制

    转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...

  4. Emily姨妈家的猫

    按书上的样例,慢慢理解. 其实,JAVASCRIPT也应该可以写出正规点的,封装性好的代码. <html> <body> <script type="text/ ...

  5. 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3940  Solved: 1736 Description ...

  6. Boostrap 模态框 水平垂直居中问题

            var editorB = new UE.ui.Editor({ initialFrameHeight: 350, initialFrameWidth: 600 });         ...

  7. Maven学习:Eclipse使用maven构建web项目(转)

    Maven学习:Eclipse使用maven构建web项目(转) 8.更改class路径:右键项目,Java Build Path -> Source 下面应该有4个文件夹.src/main/j ...

  8. Android 全屏显示-隐藏Navigation Bar

    Sumsung Galaxy Nexus 屏幕分辨率为 1280X 720,但通常的应用都会显示Navigation Bar(Back 键,Home 键等),如下图所示: 但我注意到Youtube应用 ...

  9. opengl学习

    #include"stdafx.h" #define GLUT_DISABLE_ATEXIT_HACK #include <GL/glut.h> //glut自动将gl ...

  10. POJ -- 2436

    Disease Management Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is run ...