[MATEXP] 왜 오답처리가 되는지 모르겠습니다..

  • ycs1008
    ycs1008

    아래는 소스코드 입니다.

    #include <stdio.h>
    #include <memory.h>
    
    #define MAX_SIZE 100
    
    void divide(int(*a)[MAX_SIZE], int n, int p);
    void mul(int(*a)[MAX_SIZE], int(*b)[MAX_SIZE], int n);
    
    int m[MAX_SIZE][MAX_SIZE];
    int temp[MAX_SIZE][MAX_SIZE];
    int temp1[MAX_SIZE][MAX_SIZE];
    
    int main(void)
    {
        int C, N[100], p;
        int i, j, k;
        int t[20][MAX_SIZE][MAX_SIZE];
        scanf("%d", &C);
    
    
        for (k = 0; k < C; k++){
            scanf("%d %d", &N[k], &p);
            for (i = 0; i < N[k]; i++)
                for (j = 0; j < N[k]; j++){
                    scanf("%d", &m[i][j]);
                }
            memcpy(temp1, m, sizeof(temp1));
            divide(m, N[k], p);
            memcpy(t[k], m, sizeof(t[k]));
        }
        for (k = 0; k < C; k++)
            for (i = 0; i < N[k]; i++){
                for (j = 0; j < N[k]; j++)
                    printf("%d ", t[k][i][j]);
                printf("\n");
        }
    
        return 0;
    }
    
    void mul(int (*a)[MAX_SIZE], int (*b)[MAX_SIZE], int n)
    {
        int i, j, k, t=0;
    
        for (j = 0; j < n; j++){
            for (i = 0; i < n; i++){
                for (k = 0; k < n; k++){
                    t += (a[j][k] * b[k][i]);
                }
                temp[j][i] = t % 10007;
                t = 0;
            }
        }
        memcpy(a, temp, sizeof(temp));
    }
    
    void divide(int (*a)[MAX_SIZE], int n, int p)
    {
        if (p == 1) return;
        if (p == 2){
            mul(a, a, n);
            return;
        }
    
        if (p & 0x00000001){
            divide(a, n, (p)>>1);
            mul(a, a, n);
            mul(a, temp1, n);
        }
        else{
            divide(a, n, p>>1);
            mul(a, a, n);
        }
    }
    

    9년 전
2개의 댓글이 있습니다.
  • JongMan
    JongMan

    mul()에서 오버플로우에 유의하세요.


    9년 전 link
  • ycs1008
    ycs1008

    감사합니다..
    조심해야겠다고 생각한곳인데 까먹고있었네요 ㅠㅠ


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.