设dp[n]为整数n的分割函数,由五边形定理得到:
dp[n] = dp[n-1] + dp[n-2] - dp[n-5] - dp[n-7]……
我们将其分为两部分计算
第一部分为 :( dp[n-1] - dp[n-5] …… ) 奇数项为加,偶数项为减,第j项括号内的值为 : n-(j*(3*j-1)/2)
第二部分为:(dp[n-2] - dp[n-7]……) 奇数项为加,偶数项为减,第j项括号内的值为 : n-(j*(3*j+1)/2)
如此递推便可求出n的分割函数 dp[n]
#include <iostream> #include <cmath> #include <string.h> #include <cstdio> #include <queue> #include <algorithm> using namespace std; #define LL long long #define MAXSIZE 1000005 #define INF 1e11 const LL mod=1e9+7; LL dp[MAXSIZE]; LL Solve(int n) { dp[0] = 1; for(int i=1;i<=n;i++) { for(int j=1;j*(3*j-1)/2<=i;j++) { if(j&1) dp[i] = (dp[i] + dp[i-(j*(3*j-1)/2)] + mod)%mod; else dp[i] = (dp[i] - dp[i-(j*(3*j-1)/2)] + mod)%mod; } for(int j=1;j*(3*j+1)/2<=i;j++) { if(j&1) dp[i] = (dp[i] + dp[i-(j*(3*j+1)/2)] + mod)%mod; else dp[i] = (dp[i] - dp[i-(j*(3*j+1)/2)] + mod)%mod; } } return dp[n]; } int main() { int n; scanf("%d",&n); LL ans = Solve(n); printf("%lld ",ans); return 0; }