Project Euler Problem 78

解法

分割数 - Wikipediaを参考にして漸化式を作りました.

実装(C++)

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long lli;
const int MOD=1000000;
//五角数を求める
int pentagonal(int i){
	return (i*(3*i-1))/2;
}
int p_memo[1000000];
int partition_function(int k){
	if(k<=1)return 1;
	int ans=0;
	if(p_memo[k]>0)return p_memo[k];
	for(int i=1;;i++){
		for(int j=1;j>=-1;j-=2){
			int p=abs(pentagonal(i*j));
			if(k-p<0)return p_memo[k]=ans%MOD;
			if(i%2==1)ans+=partition_function(k-p);
			else ans-=partition_function(k-p);
			ans=(ans%MOD+MOD)%MOD;
			ans%=MOD;
		}
	}
	return p_memo[k]=MOD;
}
int main() {
	for(int i=1;;i++){
		if(i%1000==0)cout<<i<<endl;
		if(partition_function(i)==0){
			cout<<"Answer:"<<i<<endl;
			break;
		}
	}
	return 0;
}