Submission #50101006


Source Code Expand

#include <stdio.h>
#include <stdlib.h>

#define PNUM 333

long long p[PNUM] = {};
long long p_pow[PNUM] = {};

int cmp_ll_PNUM (const void *a, const void *b) {
  long long *a_ = *(long long **)a;
  long long *b_ = *(long long **)b;
  int idx = 0;
  
  while (idx < PNUM) {
    if (a_[idx] < b_[idx]) {
      return -1;
    }
    if (a_[idx] > b_[idx]) {
      return 1;
    }
    idx++;
  }
  
  return 0;
}

int main () {
  int n = 0;
  char a[1001] = "";
  
  int res = 0;
  
  long long ans = 0LL;
  
  long long *a_sort[1000] = {};
  long long a_sort_arr[1000][PNUM] = {};
  long long cnt[1000] = {};
  int ucnt = 0;
  
  p[0] = 2LL;
  for (int i = 1; i < PNUM; i++) {
    int is_ok = 0;
    p[i] = p[i-1]+1LL;
    while (is_ok <= 0) {
      long long tmp = p[i];
      is_ok = 1;
      for (int j = 0; p[j]*p[j] <= p[i]; j++) {
        if (p[i]%p[j] == 0LL) {
          is_ok = 0;
        }
      }
      if (is_ok <= 0) {
        p[i] += 1LL;
      }
    }
  }
  
  for (int i = 0; i < PNUM; i++) {
    p_pow[i] = 1LL;
    while (p_pow[i] <= 2000000000LL/p[i]) {
      p_pow[i] *= p[i];
    }
  }
  
  res = scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int idx = 0;
    res = scanf("%s", a);
    a_sort[i] = a_sort_arr[i];
    while (a[idx] != '\0') {
      long long d = (long long)(a[idx]-'0');
      idx++;
      for (int j = 0; j < PNUM; j++) {
        a_sort[i][j] *= 10LL;
        a_sort[i][j] += d;
        a_sort[i][j] %= p_pow[j];
      }
    }
  }
  
  qsort(a_sort, n, sizeof(long long *), cmp_ll_PNUM);
  
  cnt[0] = 1LL;
  ucnt = 1;
  for (int i = 1; i < n; i++) {
    if (cmp_ll_PNUM((void *)(a_sort+(i-1)), (void *)(a_sort+i)) != 0) {
      a_sort[ucnt] = a_sort[i];
      ucnt++;
    }
    cnt[ucnt-1] += 1LL;
  }
  
  for (int i = 0; i < ucnt; i++) {
    for (int j = 0; j < i; j++) {
      long long tmp[PNUM] = {};
      long long *tmp_p = tmp;
      int idx[2] = { 0, ucnt };
      int ok[2] = {};
      for (int k = 0; k < PNUM; k++) {
        tmp[k] = (a_sort[j][k]*a_sort[i][k])%p_pow[k];
      }
      while (idx[1]-idx[0] > 1) {
        int nxt = (idx[0]+idx[1])/2;
        int s = ok[0];
        if (s > ok[1]) {
          s = ok[1];
        }
        while (s < PNUM && a_sort[nxt][s] == tmp_p[s]) {
          s++;
        }
        if (s < PNUM && a_sort[nxt][s] > tmp_p[s]) {
          idx[1] = nxt;
          ok[1] = s;
        } else {
          idx[0] = nxt;
          ok[0] = s;
        }
      }
      if (cmp_ll_PNUM((void *)(a_sort+idx[0]), (void *)(&tmp_p)) == 0) {
        ans += cnt[i]*cnt[j]*cnt[idx[0]];
      }
    }
  }
  
  ans <<= 1LL;
  for (int i = 0; i < ucnt; i++) {
    long long tmp[PNUM] = {};
    long long *tmp_p = tmp;
    int idx[2] = { 0, ucnt };
    int ok[2] = {};
    for (int k = 0; k < PNUM; k++) {
      tmp[k] = (a_sort[i][k]*a_sort[i][k])%p_pow[k];
    }
    while (idx[1]-idx[0] > 1) {
      int nxt = (idx[0]+idx[1])/2;
      int s = ok[0];
      if (s > ok[1]) {
        s = ok[1];
      }
      while (s < PNUM && a_sort[nxt][s] == tmp_p[s]) {
        s++;
      }
      if (s < PNUM && a_sort[nxt][s] > tmp_p[s]) {
        idx[1] = nxt;
        ok[1] = s;
      } else {
        idx[0] = nxt;
        ok[0] = s;
      }
    }
    if (cmp_ll_PNUM((void *)(a_sort+idx[0]), (void *)(&tmp_p)) == 0) {
      ans += cnt[i]*cnt[i]*cnt[idx[0]];
    }
  }
  
  printf("%lld\n", ans);
  return 0;
}

Submission Info

Submission Time
Task F - Product Equality
User chro4896
Language C (gcc 12.2.0)
Score 550
Code Size 3529 Byte
Status AC
Exec Time 1459 ms
Memory 4388 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 550 / 550
Status
AC × 3
AC × 80
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All hack_01.txt, hack_02.txt, hack_03.txt, hack_04.txt, hack_05.txt, hand_01.txt, sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt, test_58.txt, test_59.txt, test_60.txt, test_61.txt, test_62.txt, test_63.txt, test_64.txt, test_65.txt, test_66.txt, test_67.txt, test_68.txt, test_69.txt, test_70.txt, test_71.txt
Case Name Status Exec Time Memory
hack_01.txt AC 1458 ms 4328 KiB
hack_02.txt AC 1459 ms 4300 KiB
hack_03.txt AC 1457 ms 4356 KiB
hack_04.txt AC 1457 ms 4192 KiB
hack_05.txt AC 1458 ms 4180 KiB
hand_01.txt AC 5 ms 4204 KiB
sample_01.txt AC 1 ms 4292 KiB
sample_02.txt AC 2 ms 4188 KiB
sample_03.txt AC 2 ms 4296 KiB
test_01.txt AC 2 ms 4184 KiB
test_02.txt AC 2 ms 4292 KiB
test_03.txt AC 508 ms 4344 KiB
test_04.txt AC 524 ms 4344 KiB
test_05.txt AC 3 ms 4188 KiB
test_06.txt AC 197 ms 4204 KiB
test_07.txt AC 498 ms 4328 KiB
test_08.txt AC 509 ms 4220 KiB
test_09.txt AC 525 ms 4340 KiB
test_10.txt AC 3 ms 4376 KiB
test_11.txt AC 205 ms 4204 KiB
test_12.txt AC 498 ms 4300 KiB
test_13.txt AC 491 ms 4220 KiB
test_14.txt AC 562 ms 4176 KiB
test_15.txt AC 661 ms 4220 KiB
test_16.txt AC 758 ms 4224 KiB
test_17.txt AC 991 ms 4328 KiB
test_18.txt AC 363 ms 4236 KiB
test_19.txt AC 490 ms 4224 KiB
test_20.txt AC 558 ms 4356 KiB
test_21.txt AC 659 ms 4176 KiB
test_22.txt AC 750 ms 4256 KiB
test_23.txt AC 1007 ms 4348 KiB
test_24.txt AC 385 ms 4204 KiB
test_25.txt AC 726 ms 4388 KiB
test_26.txt AC 888 ms 4204 KiB
test_27.txt AC 576 ms 4260 KiB
test_28.txt AC 668 ms 4200 KiB
test_29.txt AC 803 ms 4220 KiB
test_30.txt AC 588 ms 4232 KiB
test_31.txt AC 645 ms 4208 KiB
test_32.txt AC 786 ms 4356 KiB
test_33.txt AC 206 ms 4336 KiB
test_34.txt AC 754 ms 4352 KiB
test_35.txt AC 831 ms 4204 KiB
test_36.txt AC 593 ms 4300 KiB
test_37.txt AC 715 ms 4192 KiB
test_38.txt AC 858 ms 4188 KiB
test_39.txt AC 570 ms 4204 KiB
test_40.txt AC 3 ms 4328 KiB
test_41.txt AC 1 ms 4292 KiB
test_42.txt AC 3 ms 4200 KiB
test_43.txt AC 757 ms 4232 KiB
test_44.txt AC 836 ms 4388 KiB
test_45.txt AC 896 ms 4208 KiB
test_46.txt AC 942 ms 4348 KiB
test_47.txt AC 982 ms 4376 KiB
test_48.txt AC 1012 ms 4224 KiB
test_49.txt AC 1041 ms 4348 KiB
test_50.txt AC 1064 ms 4296 KiB
test_51.txt AC 1087 ms 4356 KiB
test_52.txt AC 648 ms 4224 KiB
test_53.txt AC 541 ms 4220 KiB
test_54.txt AC 498 ms 4348 KiB
test_55.txt AC 859 ms 4372 KiB
test_56.txt AC 839 ms 4204 KiB
test_57.txt AC 596 ms 4324 KiB
test_58.txt AC 539 ms 4296 KiB
test_59.txt AC 474 ms 4340 KiB
test_60.txt AC 876 ms 4188 KiB
test_61.txt AC 709 ms 4336 KiB
test_62.txt AC 600 ms 4220 KiB
test_63.txt AC 558 ms 4352 KiB
test_64.txt AC 491 ms 4224 KiB
test_65.txt AC 897 ms 4192 KiB
test_66.txt AC 757 ms 4300 KiB
test_67.txt AC 614 ms 4192 KiB
test_68.txt AC 553 ms 4236 KiB
test_69.txt AC 495 ms 4324 KiB
test_70.txt AC 875 ms 4176 KiB
test_71.txt AC 720 ms 4300 KiB