projecteuler No.78 Coin partitions
来源:互联网 发布:淘宝小型家庭清冼机 编辑:程序博客网 时间:2024/05/18 16:56
原文题目链接:
http://projecteuler.net/problem=78
翻译题目链接:
http://pe.spiritzhang.com/index.php/2011-05-11-09-44-54/79-78
通过人数:8032
题目分析:
粗一看,像是一道很经典的动态规划问题。于是我设基本状态(m,n)为m个硬币分n堆放所可以放的种类数,以(m,n)=(m-1,n-1)+(m-n,n)为递推关系,写出了如下代码:
#include<stdio.h>int m[21000]={0};int p[21000][21000]={0};int main(){for (int i = 1; i < 10000; i++){for (int j = 1; j <= i; j++){if (i == j)p[i][j] = 1;else{p[i][j] = p[i - 1][j - 1];if (i >= 2 * j)p[i][j] += p[i-j][j];}p[i][j] = p[i][j] % 1000000;}for (int j=1;j<=i;j++){m[i] += p[i][j];m[i] = m[i] % 1000000;}if (m[i] == 0)printf("%d %d\n",i,m[i]);}return 0;}于是非常悲惨的发现:在内存允许范围内,没有找到...
接下来我尝试了将超过内存范围的地方使用递归,未超出的地方从数组取值的解法,但非常悲惨也非常正常的发现递归部分非常慢...一天之内算不完...
于是我上网查了一下资料,注意到了以下一片博文:
Project Euler 78: Investigating the number of ways in which coins can be separated into piles.
在这其中提到了维基百科中的这个条目:Partition(number theory)那里有如下公式:(其中p(n)表示n个硬币的分堆数即整数n的分拆数)
.............................................(1)
上式将等号右边按等比级数分解之后其组合意义就显然了。上式的右边即为p(n)的母函数
而p(n)的母函数的倒数即为欧拉函数,其系数有五边形数定理:
即:(等号右边的系数为广义五边形数)
(2)
将以上两式联立,有:
进行系数比较,即可得到p(n)的递推公式:
其减去的值的序列为广义五边形数序列,满足:
这下,有了比较好的公式,就可以做了~
解题过程(代码仅供参考,因为偷懒,代码风格什么的实在不好意思...):
一、生成所需的广义五边形数序列:
int a[1000];for (int i=0;i<1000;i++){int n=(i+1)/2;if (i%2==0)a[i]=(3*n*n+n)/2;elsea[i]=(3*n*n-n)/2;}二、计算整数分拆序列并求出所需值:
int n[100000]={0};n[0]=1;for (int i=1;i<100000;i++){for (int j=1;a[j]<=i;j++){if (j%4==1||j%4==2)n[i]+=n[i-a[j]];elsen[i]-=n[i-a[j]];}n[i] = n[i] % 1000000;if (n[i]==0)printf("%d\n",i);}打印出所求值:55374
感觉还是要好好学习数学...这道题主要花的时间都花在错误的尝试和看数学证明上了。
以上只是我做题时的解法。
如果有更好的解法、更好的思路,欢迎评论讨论~O(∩_∩)O~
0 0
- projecteuler No.78 Coin partitions
- Project Euler 78 : Coin partitions
- Project Euler:Problem 78 Coin partitions
- projecteuler No.205 Dice Game
- projecteuler No.96 Su Doku
- projecteuler No.77 Prime summations
- projecteuler No.120 Square remainders
- projecteuler No.124 Ordered radicals
- projecteuler No.83 four ways
- projecteuler No.66 Diophantine equation
- projecteuler No.100 Arranged probability
- Partitions
- projecteuler No.68 Magic 5-gon ring
- projecteuler No.64 Odd period square roots
- projecteuler No.80 Square root digital expansion
- projecteuler No.90 Cube digit pairs
- projecteuler No.121 Disc game prize fund
- projecteuler No.104 Pandigital Fibonacci ends
- Java计算字符在字符串内出现的次数
- Hibernate——Query查询
- Struts 2版验证码
- ThinkPHP验证码
- Win32 Linux汇编语法区别
- projecteuler No.78 Coin partitions
- Java去除集合List内重复记录
- uva 1442 - Cav(贪心)
- 九度OJ 1514 数值的整数次方【算法】
- CAlayer学习翻译
- 图片缩小的类
- 思维导图之软件工程视频
- Java操作properties文件
- HDU1241_Oil Deposits(BFS)+(DFS)