아... Weird문제 푸는데 죽겠네요...

  • 공상가
    공상가

    아래와 같이 소스를 작성했는데요, 이거 진짜 돌아버리겠네요 ;ㅁ;
    #include
    #define MAX 500000
    int powc(int, int);
    void program();
    int main() {
    int i, casen;
    scanf("%d",&casen);
    for(i=0;i }
    void program() {
    int arr[MAX]={0};
    long long bit_vector=0;
    int num;
    int sum=0;
    int arrindex=0;
    int i,j,k;
    scanf("%d",&num);
    for(i=1;i*i<=num;i++) {
    if(!(num%i)) {
    arr[arrindex++]=i;
    if(num/i!=i&&num/i!=num) {
    arr[arrindex++]=num/i;
    }
    }
    }
    for(i=0;i bit_vector++;
    sum=0;
    for(j=0;j if(bit_vector&(1< sum+=arr[j];
    }
    }
    if(sum==num) {
    printf("not weirdn");
    return;
    }
    }
    printf("weirdn");
    return;
    }
    int powc(int a, int b) {
    if(b==0) return 1;
    return a*powc(a,b-1);
    }
    계속 시간초과만 뜨고... 제가 어디서 더 최적화를 시킬 수 있을까요?;ㅅ;.....
    누가 좀 지적좀..ㅠ_ㅠ;;

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]


    15년 전
3개의 댓글이 있습니다.
  • Taeyoon_Lee
    Taeyoon_Lee

    int arr[MAX]={0};
    이걸 전역 변수로 선언해보세요~ 지역 변수로는 50만이나 되는 배열을 잡을 수 없어요.


    15년 전 link
  • Toivoa
    Toivoa

    powc 대신 2의 제곱수만 사용하니까 array로 미리 만들어놓는게 좋습니다.


    15년 전 link
  • JongMan
    JongMan

    이싸람들이 결정적이지 않은 대답만 해주고 ㅋㅋㅋㅋㅋㅋㅋ 
    지금 약수의 개수 D 에 대해 2^D 로 모든 약수의 조합을 세어보고 계신데요, 이와 같은 방법으로는 절대 시간 안에 나올 수가 없습니다. 약수의 개수가 60, 70 넘어도 올라가는데 (40만 넘는 숫자 몇 개만 테스트해봐도 이와 같은 경우가 많죠: 400050 의 약수는 70개가 넘어용)  2^D 알고리즘이 시간 안에 동작할 리가 없겠죠. ^^;
    그것보다는 동적 계획법을 사용하는 알고리즘을 작성하시는 게 좋은데요, 그거는 http://algospot.com/zbxe/?mid=editorial&document_srl=50135 요기 있는 에디토리얼을 참고하시길~


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