【问题标题】:check number of multiples of the element in array having index smaller than that element检查数组中索引小于该元素的元素的倍数
【发布时间】:2020-02-04 21:37:00
【问题描述】:

问题描述:

给你一个序列A1,A2,…,AN。对于每个有效的i,元素A_i 的星号是有效索引j<i 的数量,这样A_j 可以被A_i 整除。找出给定序列中的最大星值。

我的尝试:
我已经尝试过一种方法,可以在数组中找到最大元素,直到i'th 索引(比如MAX_i)。我为所有元素保留一个计数数组f[]。 我正在从A_i 迭代到MAX_iA_i 的倍数,并计算可被A_i 整除的元素数 ans=ans+f[element]

  long long int n,key,m=-1,ans=0,star_max=-1;
  int f[1000004];
  memset(f, 0, sizeof(f));
  scanf("%lld", &n);
  for (int i = 0; i < n; ++i)
  {
      scanf("%lld", &key);
      ans=0;
      for(long long int i=key;i<m;i+=key)
      {
          ans+=f[i];
      }
      if(ans > star_max)
        star_max=ans;
      f[key]++;
      if (a[i] > m)
        m=a[i];
  }
  cout<<star_max;

任何 O(N) 或 O(NlogN) 方法都值得赞赏。

【问题讨论】:

  • 是C++程序还是C程序?
  • 假设列表是 [a,b,c,d,e,f,g]。现在如果 'd' 可以被 'g' 整除,那么 'd' 后面的所有数字都是'd' 的倍数也可以被 'g' 整除。所以很明显'g'将比'd'有更多的倍数。所以,忽略 'd' 并且不需要检查它。
  • @Anubhaw Choudhary 愿可除数之间存在差距,例如 A0 可以被 A3 整除,A1 不能被 A3 整除,A2 可以被 A3 整除。所以可整除数的最大长度等于2。对吗?
  • @Vlad 来自莫斯科,是的,可能存在差距

标签: c++ algorithm


【解决方案1】:
  long long int N;
  long long int c[1000006],val,max_star=-1;
  memset(c, 0, sizeof(c));
  scanf("%lld", &N);
  for (int i = 0; i < N; ++i)
  {
      scanf("%lld", &val);
      if(c[val] > max_star)
        max_star=c[val];
      long long int s=sqrt(val);
      for(int j=1;j<=s;j++)
      {
          if(val%j == 0)
          {
              c[j]++;
              long long int r=val/j;
              if(r != j)
              {
                  c[r]++;
              }
          }
      }
  }
    printf("%lld",max_star);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2019-01-12
    • 2018-10-17
    • 2016-06-09
    • 1970-01-01
    • 2013-11-09
    • 2021-11-07
    相关资源
    最近更新 更多