hdu 5459 Jesus Is Here(dp)

제목 링크: hdu 5459 Jesus Is Here
문제 풀이 의 사고 방향.
사실 모든 c 는 이 cff 에 대응 하고 꼬치 i 는 꼬치 i - 1 과 i - 2 로 생 성 되 기 때문에 답 도 i - 1, i - 2 를 통 해 얻 을 수 있 습 니 다.
각 문자열 에 대해 서 는 4 개의 값 dis (각 c 의 위치 와), len (문자열 의 길이), cnct (몇 개의 c), sum (답) 의 구체 적 인 이전 공식 은 코드 를 참조 합 니 다.
코드
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;
const int maxn = 201314;
const int mod = 530600414;

ll dis[maxn+5], len[maxn+5], cnt[maxn+5], sum[maxn+5];

void init () {
    len[1] = cnt[1] = 1;
    dis[1] = sum[1] = 0;

    len[2] = 2, cnt[2] = 0;
    dis[2] = sum[2] = 0;

    for (int i = 3; i <= maxn; i++) {
        dis[i] = (dis[i-2] + dis[i-1] + cnt[i-1] * len[i-2] % mod) % mod;
        len[i] = (len[i-1] + len[i-2]) % mod;
        cnt[i] = (cnt[i-1] + cnt[i-2]) % mod;
        ll add = cnt[i-2] * (dis[i-1] + cnt[i-1] * len[i-2] % mod) % mod;
        ll del = cnt[i-1] * dis[i-2] % mod;
        sum[i] = ((sum[i-1] + sum[i-2] + add - del) % mod + mod) % mod;
    }
}

int main () {
    init();

    int cas, n;
    scanf("%d", &cas);
    for (int kcas = 1; kcas <= cas; kcas++) {
        scanf("%d", &n);
        printf("Case #%d: %lld
"
, kcas, sum[n]); } return 0; }

좋은 웹페이지 즐겨찾기