HDU-5332(접두어 및 최적화 dp/CDQ+NTT)

2689 단어

HDU-5332(CDQ+NTT/ 접두어 및 최적화 dp)


점\(i\) 의 답을 차례로 구하는 것을 고려하다
가령 현재\(i-1\)개의 점이 있고 제\(i\)개의 점 앞에 있는 점수\(j\)를 열거하고 있다면\(dp i=dp {i-j-1}\cdot(j+1)^2\cdotC(i-1,i-j-1)\cdotj!\)
직접 이전은\(O(n^2)\)이며,\(dp\) 이전이 차치와 관련이 있음을 볼 수 있으므로\(CDQ\)분할+\(NTT\)로 해결할 수 있습니다.
이런 간단하고 거친 방법에 관하여 템플릿 문제 HDU-5730 문제 풀이
다음은 폭력 코드입니다.
#include
using namespace std;

#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)

template  inline void cmin(T &a,T b){ ((a>b)&&(a=b)); } 
template  inline void cmax(T &a,T b){ ((a>=1,x=x*x%P) if(k&1) res=res*x%P;
    return res;
}

void NTT(int n,ll *a,int f){
    rep(i,1,n-1) if(rev[i]>i) swap(a[i],a[rev[i]]);
    for(reg int i=1;i>1;
    Solve(l,mid);
    int R=1,c=-1;
    while(R<=r-l+1) R<<=1,c++;
    rep(i,1,R) rev[i]=(rev[i>>1]>>1)|((i&1)<

\[\\]

다음은 \ (O (n) \) 방법입니다.


전이 관찰\(dp i=dp {i-j-1}\cdot(j+1)^2\cdotC(i-1,i-j-1)\cdotj!\)
변형\(dp i=dp j\cdot(i-j)^2\cdot\rac{(i-1)!}{j!}\)
접두사 및 전환 고려
곱하기 문제는 매개 변수 분리를 통해 잘 해결될 수 있습니다.\(i-j)^2\) 문제입니다
\(i\rightarrow i+1\)일 때\((i-j)^2\rightarrow(i+1-j)^2\)
꺼내 보시면\(x^2\rightarrow(x+1)^2=x^2+2x+1\)
따라서\(a=\sum x^2dp j, b=\sum xdp j, c=\sum dp j\) 를 기록할 수 있습니다
그래서 매번\(i\) 증가하고\(a=a+2b+c,b=b+c\)
#include
using namespace std;

#define reg register
typedef long long ll;
#define rep(i,a,b) for(reg int i=a,i##end=b;i<=i##end;++i)
#define drep(i,a,b) for(reg int i=a,i##end=b;i>=i##end;--i)

template  inline void cmin(T &a,T b){ ((a>b)&&(a=b)); } 
template  inline void cmax(T &a,T b){ ((a

좋은 웹페이지 즐겨찾기