※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


Problem 78 「コインの分割」 †

n 枚のコインを異なった方法で山に分ける場合の数を p(n) と表わす. 例えば, 5枚のコインを山に分ける異なったやり方は7通りなので p(5)=7 となる.

OOOOO

OOOO O

OOO OO

OOO O O

OO OO O

OO O O O

O O O O O

p(n) が100万で割り切れる場合に最小となる n を求めよ.





解法
理屈はわかりませんがWikiに書いてある分割数の漸化式で答えが出ます。
末尾6ケタ意外計算に必要ないのですから、100万以上は切り捨てるくらいです。
配列のないPrologで書いたらあまりエレガントとはいいがたいことになるのでProlog言語では書きません。



#include<stdio.h>
#include<vector>

const int MOD=1000*1000;
int main(){
	std::vector<int> p;
	p.push_back(1);
	p.push_back(1);
	for(int i=2;;i++){
		int d=1;
		int n=1;
 		int add;
		int sum=0;
		while(1){
 			int a=(n*(3*n-1))/2;
			add= i>=a?p[i-a]:0;
			sum+=add*d;
			
 			int b=(-n*(3*(-n)-1))/2;
			add=i>=b?p[i-b]:0;
			sum=(sum+add*d) % MOD;
			d*=-1;
			n++;
			if(i<b)break;
 		}
		if(sum==0){
			printf("%d\n",i);
			break;
		}
		p.push_back(sum);
	}
}