partition numbers的定义

A000041

就是将正整数n分为k(\(1\le k\le n)\)个正整数相加,即\(n=a_1+a_2+...+a_k\)且\(a_1\le a_2\le a_3 ... \le a_k\),的方案数是a(n)。

计算公式

Partition Numbers - Programming Praxis

代码

这个c++程序只能计算到a(121),要算更大的需要用高精度,因为c++高精度要自己写,我就没写了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define ll long long
using namespace std;
ll dp[200];
ll p(int x){
if(x<0)return 0;
if(x<=1)return 1;
if(dp[x])return dp[x];
int ans=0;
for(int i=1;i<=x;i++){
ans+=(ll)(i%2?1:-1)*(p(x-i*(i*3-1)/2)+p(x-i*(i*3+1)/2));
}
return dp[x]=ans;
}
int main() {
for(int i=1;i<=121;i++)
printf("a(%d)=%lld\n",i,p(i));
return 0;
}

输出:

a(1)=1

a(2)=2

a(3)=3

a(4)=5

a(5)=7

a(6)=11

a(7)=15

a(8)=22

a(9)=30

a(10)=42

a(11)=56

a(12)=77

a(13)=101

a(14)=135

a(15)=176

a(16)=231

a(17)=297

a(18)=385

a(19)=490

a(20)=627

...

突然发现自己非常naive。发现HDU上有原题HDU-4651 Partition,就是求分拆数,题目有要求答案取模。

然后用五边形数定理得到递推式来算。代码如下

#include <cstdio>
#define ll long long
using namespace std;
#define N 100001
const ll M = 1e9+7;
int B[N]={1,1,2};
void get(int i){
for(int j=1;;++j)
for(int k=-1;k<2;k+=2){
int w=(3*j*j+k*j)/2;
if(w>i)return;
if(j%2)B[i]=(B[i]+B[i-w])%M;
else B[i]=(B[i]-B[i-w]+M)%M;
}
}
int t,n;
int main() {
for(int i=3;i<N;++i)
get(i);
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",B[n]);
}
return 0;
}

Partition Numbers的计算的更多相关文章

  1. Sum Root to Leaf Numbers深度优先计算路径和

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  2. HDU4192 Guess the Numbers(表达式计算、栈)

    题意: 给你一个带括号.加减.乘的表达式,和n个数$(n\leq 5)$,问你带入这几个数可不可能等于n 思路: 先处理表达式:先将中缀式转化为逆波兰表达式 转换过程需要用到栈,具体过程如下:1)如果 ...

  3. 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)

    hdu 4658 Integer Partition 题意 n分拆成若干个正整数的和,每个正整数出现小于k次,分拆方案有多少.(t<=100,n<=1e5) 题解 之前写过一篇Partit ...

  4. [Swift]LeetCode561. 数组拆分 I | Array Partition I

    Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...

  5. [源码解析] PyTorch 流水线并行实现 (5)--计算依赖

    [源码解析] PyTorch 流水线并行实现 (5)--计算依赖 目录 [源码解析] PyTorch 流水线并行实现 (5)--计算依赖 0x00 摘要 0x01 前文回顾 0x02 计算依赖 0x0 ...

  6. Clojure的并行与并发

    这次来聊聊clojure的并行与并发,如果你还不知clojure为何物,请翻翻我的上一篇推文.“并行”是指clojure对并行计算的支持(parallel computing),“并发”是其并发特性( ...

  7. P163、面试题29:数组中出现次数超过一半的数字

    题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 思 ...

  8. 20140704笔试面试总结(java)

    1.java数组定义 1.与其他高级语言不同,Java在数组声明时并不为数组分配存储空间,因此,在声明的[]中不能指出数组的长度 2.为数组分配空间的两种方法:数组初始化和使用new运算符 3.未分配 ...

  9. 剑指Offer全解

    二维数组中的查找 描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中 ...

随机推荐

  1. Luogu1344 追查坏牛奶 最小割

    题目传送门 题意:给出$N$个节点$M$条边的有向图,边权为$w$,求其最小割与达到最小割的情况下割掉边数的最小值.$N \leq 32,M \leq 1000,w\leq 2 \times 10^6 ...

  2. JS-JS变量命名规则

    原则 变量名区分大小写,允许包含字母.数字.美元符号($)和下划线,但第一个字符不允许是数字,不允许包含空格和其他标点符号. 禁止使用JavaScript关键词.保留字全名. 变量命名长度应该尽可能的 ...

  3. mybatis 反射bean规则

    1,根据查询字段名,寻找 bean变量名设置,变量可为私有属性 2,根据查询字段名 set方法名,设置bean属性 此方法 为 ‘set‘+字段名,大小写忽略,即 方法set后面第一个字母可以是大小写 ...

  4. 11.11 开课二个月零七天(ajax和bootstrp做弹窗)

    1.用ajax做弹窗显示信息详情 nation.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  5. 程序员眼中的Redis

    Redis 是用C语言编写的内存中的数据结构存储系统,可以用来作数据库.缓存.消息中间件. 数据结构 字符串(strings):值是任何种类的字符串 散列(hashs):值是map 字典,数组+链表, ...

  6. rrd文件及rrd文件与实际数据的对比研究。

    一,什么是rrd文件? 所 谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置.我们可以把用于存储数据的数据库的空间看成一个圆,上 ...

  7. Linux内核分析——可执行程序的装载

    链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...

  8. 【软件工程】5.8 黑盒&白盒测试

    代码链接:http://www.cnblogs.com/bobbywei/p/4469145.html#3174062 搭档博客:http://www.cnblogs.com/Roc201306114 ...

  9. net license tool, EasyLicense !

    net license tool, EasyLicense ! 开源 .net license tool, EasyLicense !   介绍: 过去我常常像是否有一个帮助授权的软件,它可以非常简单 ...

  10. JMX configuration for Tomcat

    Window下执行步骤: D:\apache-tomcat-7.0.57\bin\catalina.bat set CATALINA_OPTS=-Dcom.sun.management.jmxremo ...