51Nod-1259- 정수 분할 V2
51Nod-1259- 정수 분할 V2
N을 몇 개의 정수의 합으로 나누면 몇 가지 다른 구분 방식이 있습니까? 예를 들어 n=4, {4} {1,3} {2,2} {1,1,2} {1,1,1,1}, 모두 5가지입니다.데이터가 비교적 크기 때문에 모드 10^9+7의 결과를 출력하면 된다.
Input
N(1 <= N <= 50000) 수를 입력합니다.
Output
출력 분할 수량 Mod 10^9 + 7.
Input 예
4
Output 예
5
블록 DP 복잡성 O (n*sqrt(n)
m = sqrt(n) 설정
우리는 우선 1~m의 모은 수를 사용하는 방안을 고려할 수 있는데, 완전히 배낭을 메면 된다
나머지 m+1~n에 대해 우리는 개수당 최대 m회까지 사용한 것을 발견했다. 그리고 g[i][j]는 i개수(m+1~m+i)와 j를 위한 방안의 수를 m++ g[i][j]=g[i-1][j-m]+g[i][j-i]로 표시했다.하나의 서열에 대해 우리는 두 가지 조작이 있다.기수 m 2 를 추가합니다.매 수마다 +1(여기 j는 정매거이기 때문에 매 수마다 1을 중복할 수 있음)
Code
#include
#define LL long long
#define RG register
using namespace std;
inline int gi() {
int f = 1, s = 0;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -1, c = getchar();
while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
return f == 1 ? s : -s;
}
const int N = 50010, Mod = 1e9+7;
int f[N], g[250][N], s[N];
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
int n = gi(), m = sqrt(n)+1;
f[0] = 1;
for (int i = 1; i < m; i++)
for (int j = i; j <= n; j++)
(f[j] += f[j-i]) %= Mod;
int ans = 0;
g[0][0] = 1;
s[0] = 1;
for (int i = 1; i < m; i++) {
for (int j = m; j <= n; j++) {
g[i][j] = (g[i-1][j-m] + g[i][j-i]) % Mod;
s[j] = (s[j] + g[i][j]) % Mod;
}
}
for (int i = 0; i <= n; i++)
ans = (ans + (LL)f[i]*s[n-i]%Mod) % Mod;
printf("%lld
", ans);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제이티의 사용에 대한 상세한 설명Continuation 메커니즘을 이용하여 대량의 사용자 요청과 비교적 긴 연결을 처리한다.또한 Jetty는 매우 좋은 인터페이스를 설계했기 때문에 Jetty의 어떤 실현이 사용자의 수요를 만족시키지 못할 때 사용자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.