ACWing 1307. 황소 및 암소(조합수, DP, 접두어 및)

1307. 암소와 암소

사고방식 1

  • f[i] f[i] f[i]는 ii의 젖소가 있고 마지막 소는 반드시 수소의 방안 수를 나타낸다.
  • f [ i ] = ∑ 0 i − k − 1 f [ i ] f[i] =\sum_{0}^{i-k-1} f[i] f[i] = ∑0i-3-k-1f[i](s[i-3-k, i-3-1])(s[i-k, i-1])(s[i-3-k, i-1])는 암소만 넣을 수 있다.
  • 최종 답안: ∑0 n f [i]\sum{0}^{n}f[i] ∑0n f[i], 일을 분류하고 덧셈 원리.
  • #include 
    using namespace std;
    
    const int mod = 5000011,size = 1e5+10;
    int n,k,f[size] = {
         1},s[size] = {
         1};
    
    int main(){
         
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
         
            f[i] = i-k-1>=0?s[i-k-1]:f[0];
            s[i] = (s[i-1]+f[i])%mod;
        }
        printf("%d
    "
    ,s[n]); return 0; }

    사고방식 2

  • 직접 f[i] f[i] f[i]로 ii 소 두마리를 표시하는 방안수
  • 만약 제 iii가 암소라면 앞 i-3-1i-1i-3은 제목에 따라 마음대로 놓으면 된다.
  • 만약에 제 iii두우가 수소라면, s[i-3-k]s[i-k]s[i-3-k]~s[i-31]s[i-1]s[i-31]는 수소가 될 수 없고, 단지 암소일 뿐이다.그래서 이때 i-3-k-1i-k-1i-3-k-1 소 1마리는 제목의 요구에 따라 임의로 놓는다.f [ i ] = f [ i − 1 ] + f [ i − k − 1 ] f[i]=f[i-1]+f[i-k-1] f[i]=f[i−1]+f[i−k−1]

  • 정답은 f [n] f [n] f [n]
  • #include 
    using namespace std;
    
    const int mod = 5000011,size = 1e5+10;
    int n,k,f[size] = {
         1};
    
    int main(){
         
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
         
            f[i] = f[i-1];
            if(i-k-1>=0) f[i] = (f[i]+f[i-k-1])%mod;
            else f[i] = (f[i]+1)%mod;
        }
        printf("%d
    "
    ,f[n]); return 0; }

    좋은 웹페이지 즐겨찾기