Partition Numbers的计算
partition numbers的定义
就是将正整数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的计算的更多相关文章
- Sum Root to Leaf Numbers深度优先计算路径和
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- HDU4192 Guess the Numbers(表达式计算、栈)
题意: 给你一个带括号.加减.乘的表达式,和n个数$(n\leq 5)$,问你带入这几个数可不可能等于n 思路: 先处理表达式:先将中缀式转化为逆波兰表达式 转换过程需要用到栈,具体过程如下:1)如果 ...
- 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)
hdu 4658 Integer Partition 题意 n分拆成若干个正整数的和,每个正整数出现小于k次,分拆方案有多少.(t<=100,n<=1e5) 题解 之前写过一篇Partit ...
- [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 ...
- [源码解析] PyTorch 流水线并行实现 (5)--计算依赖
[源码解析] PyTorch 流水线并行实现 (5)--计算依赖 目录 [源码解析] PyTorch 流水线并行实现 (5)--计算依赖 0x00 摘要 0x01 前文回顾 0x02 计算依赖 0x0 ...
- Clojure的并行与并发
这次来聊聊clojure的并行与并发,如果你还不知clojure为何物,请翻翻我的上一篇推文.“并行”是指clojure对并行计算的支持(parallel computing),“并发”是其并发特性( ...
- P163、面试题29:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 思 ...
- 20140704笔试面试总结(java)
1.java数组定义 1.与其他高级语言不同,Java在数组声明时并不为数组分配存储空间,因此,在声明的[]中不能指出数组的长度 2.为数组分配空间的两种方法:数组初始化和使用new运算符 3.未分配 ...
- 剑指Offer全解
二维数组中的查找 描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中 ...
随机推荐
- JS-JS代码插入位置
一.HTML 页面的 <head> 部分中 由于 HTML 文档是由浏览器从上到下依次载入的,将 JavaScript 代码放置于<head></head> 标签之 ...
- electron 开发实时加载
第一个方式 cnpm install electron-reload --save-dev cnpm install electron-prebuilt --save-dev require('ele ...
- Luogu P4427 [BJOI2018]求和
这是一道巨狗题,我已无力吐槽为什么我怎么写都不过 我们对于这种无修改的边权题目有一个经典的树上差分套路: \(ans=sum_x+sum_y-2\cdot sum_{LCA(x,y)}\) 这里的\( ...
- JQuery如何实现双击事件时不触发单击事件
单击和双击事件的执行顺序: 单击(click):mousedown,mouseout,click: 双击(dblclick):mousedown,mouseout,click , mousedown, ...
- IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
来自:https://blog.csdn.net/chenyunqiang/article/details/81026823 1.构建项目并添加项目结构配置以及配置初始参数 1.1.如图将基本的架子搭 ...
- 在Windows7上如何找到Cookie
摘要 出于兴趣爱好,前一阵子做了一个网页,网页中需要用到Cookie,但是,根据书上的说明,并没有找打教材中所说的Cookie的位置,本文就主要介绍在计算机(Win7)中Cookie的存放位置,同样适 ...
- Shell编程基础篇-上
1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...
- 一个很好用的在线编辑、展示、分享、交流JavaScript 代码的平台
在发表博客时,有一些代码只能粘贴进去,而不能看到代码运行的效果,需要读者把代码粘贴进自己的编辑器,然后再运行看效果,这是一件很耗时的事情 在平时百度的时候,我发现一些网站可以在线预览功能,而且可以在线 ...
- react/React Native 在 import 导入时,有的带花括号{},有的不带原理解析
在使用import引用模块时,如何正确使用{} 例如:有两个文件,home.js.user.js 一:不使用{}: 当需要在home.js中引入user.js的时候 //home.js 文件中impo ...
- 1013 B. And
链接 [http://codeforces.com/contest/1013/problem/B] 题意 给你一个n和x,再给n个数,有一种操作用x&a[i]取代,a[i],问使其中至少两个数 ...