結果

問題 No.3 ビットすごろく
コンテスト
ユーザー Drakkon
提出日時 2018-02-20 17:50:19
言語 C(gnu17)
(gcc 15.3.0)
コンパイル:
gcc-15 -O2 -std=gnu17 -Wno-error=implicit-function-declaration -Wno-error=implicit-int -Wno-error=incompatible-pointer-types -Wno-error=int-conversion -DONLINE_JUDGE -o a.out _filename_ -lm
実行:
./a.out
結果
WA  
実行時間 -
コード長 2,651 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 98 ms
コンパイル使用メモリ 39,552 KB
実行使用メモリ 5,888 KB
最終ジャッジ日時 2026-07-21 19:02:47
合計ジャッジ時間 1,922 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 10 WA * 23
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <stdio.h>

int bitCount(int m);
int numberOfDigits(int d);
int explore1(int e1);
int explore2(int e2, int n);

int main(void){
/*n:ƒS�[ƒ‹ i:Ž萔 j:ƒS�[ƒ‹’¼‘O‚̃}ƒX*/
    int n, i = 1, j = 1, t;
    scanf("%d", &n);

/*ƒS�[ƒ‹’¼‘O‚܂ł̎萔‚𐔂¦‚é*/
    do{
        if(j + bitCount(j) <= n){
            j += bitCount(j);
            i++;
        }
        else{
            break;
        }
    }while(j < n);

/*ƒS�[ƒ‹‚ɒ¼�ڍs‚¯‚éƒ}ƒX‚ð‹�‚߁A�o—͂·‚é*/
    if(j == n){
        printf("%d\n", i);
    }
    else{
        t = explore1(n);
        i++;
        if(t == -1){
            printf("%d\n", -1);
        }
        else{
            if(explore2(t, n) != j){
                do{
                    if(explore1(t) == -1){
                        printf("%d\n", -1);
                        break;
                    }
                    else if(explore2(t,n) == j){
                        i++;;
                        break;
                    }
                    else{
                        t = explore1(t);
                        i += 2;
                    }
                }while(0);
                printf("%d\n", i);
            }
            else{
                i++;
                printf("%d\n", i);
            }
        }
    }

    return 0;
}

//“ñ�i�”‚ɂµ‚½‚Ƃ«‚Ì1‚̐”‚ð‹�‚߂éŠ֐”
int bitCount(int m){
    int i = 1, count = 0;
    if(m % 2 != 0){
        count++;
        m--;
    }
    while(i < m){
        i *= 2;
    }
    if(i > m){
        i /= 2;
    }
    while(m > 0){
        m -= i;
        i /= 2;
        count++;
    }
    return count;
}

//“ñ�i�”‚ɂµ‚½‚Ƃ«‚̌…�”‚ð‹�‚߂éŠ֐”
int numberOfDigits(int d){
    int i = 1, j = 0;
    while(i < d){
        i *= 2;
    }
    if(i > d){
        i /= 2;
    }
    while(i > 0){
        i /= 2;
        j++;
    }
    return j;
}

//n‚ɂ¢‚¯‚éƒ}ƒX‚ðŒã‚납‚炳‚ª‚·Š֐”(n‚ð“ü‚ê‚Ă­‚¾‚³‚¢)
//digits:Œ…�” t:e1 - i‚ð•ۑ¶
int explore1(int e1){
    int i = 1, digits, t;
    digits = numberOfDigits(e1);
    while(i <= digits){
        t = e1 - i;
        if(t + bitCount(t) == e1){
            return t;
            break;
        }
        i++;
    }
    return -1;
}

//n‚ɂ¢‚¯‚éƒ}ƒX‚ɂ¢‚¯‚éƒ}ƒX‚ð‘O‚©‚ç’T‚·Š֐”
//digits:Œ…�” t:e2 - i‚ð•ۑ¶ n:ƒ�ƒCƒ“Š֐”“à‚Ìn‚ð“ü‚ê‚é
int explore2(int e2, int n){
    int i = 1, digits, t;
    digits = numberOfDigits(e2);
    while(i <= digits || t < n){
        t = e2 + i;
        if(t - bitCount(t) == e2){
            return t;
            break;
        }
        i++;
    }
    return -1;
}
0