Submission #2175686


Source Code Expand

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>

const int MAX_N = 100;
const int BACK = 0;
const int FRONT = 1;

void permutations(int n, int ary_coin[]);
void perm_sub(int n, int m, int ary_coin[]);
void print_perm(int n, int coin_buffer[]);

int  coin_buffer[MAX_N + 1];
bool used[MAX_N + 1];

int denominator = 0;
int molecule = 0;

int main(void)
{
    int N;
    int ary_coin[MAX_N + 1];
    double expected_value = 0;

    // 配列の初期化
    for(int i = 0; i < MAX_N + 1; i++)
    {
        coin_buffer[i] = 0;
        used[i] = false;
    }

    scanf("%d", &N);

    for(int i = 0; i < N; i++)
    {
        scanf("%d", &ary_coin[i]);
    }

    permutations(N, &ary_coin[0]);

    // 期待値の演算
    expected_value = (double)molecule / (double)denominator;

    printf("%lf", expected_value);

    return 0;
}

void permutations(int n, int ary_coin[])
{
    perm_sub(n, 0, &ary_coin[0]);
}

void perm_sub(int n, int m, int ary_coin[])
{

    if (n == m)
    {
        print_perm(n, &coin_buffer[0]);
    }
    else
    {
        for (int i = 0; i < n; i++)
        {
            if (used[i]) continue;
            coin_buffer[m] = ary_coin[i];
            used[i] = true;
            perm_sub(n, m + 1, &ary_coin[0]);
            used[i] = false;
        }
    }
}

void print_perm(int n, int coin_buffer[])
{

    // 表と裏を管理する配列
    // 0 : 裏, 1 : 表
    int back_front[MAX_N + 1];

    // 配列の初期化
    for(int i = 0; i < MAX_N + 1; i++)
    {
        back_front[i] = FRONT;
    }

    for(int i = 0; i < n; i++)
    {
        for(int j = i + 1; j < n; j++)
        {
            if( coin_buffer[j] % coin_buffer[i] == 0 )
            {
                // コインに対応する倍数が見つかった時
                if( back_front[j] == FRONT )
                {
                    back_front[j] = BACK;
                }
                else
                {
                    back_front[j] = FRONT;
                }
            }
        }
    }

    // 期待値の分子となる値を計算する
    for(int i = 0; i < n; i++)
    {
        molecule += back_front[i];
    }

    // 期待値の分母となる、順列の場合の数を足しておく
    denominator++;
}

Submission Info

Submission Time
Task C - コイン
User omisima
Language C (GCC 5.4.1)
Score 0
Code Size 2409 Byte
Status CE

Compile Error

./Main.c:15:6: error: variably modified ‘coin_buffer’ at file scope
 int  coin_buffer[MAX_N + 1];
      ^
./Main.c:16:6: error: variably modified ‘used’ at file scope
 bool used[MAX_N + 1];
      ^
./Main.c: In function ‘main’:
./Main.c:34:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &N);
     ^
./Main.c:38:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &ary_coin[i]);
         ^