费解的gcd

费解的gcd

https://ac.nowcoder.com/acm/contest/71419/F

#include<iostream>
#include<algorithm>
using namespace std;
const int mod = 998244353;
#define ll long long
int a[500010], qu[1000010];//这里需要一个足够大的数组
bool vis[500010];
int  gcd(int k, int t) {
    if (t == 0)return k;
    else
        return gcd(t, k % t);
}//背会理解gcd的用法
int main()
{

  ll m, n, i, j, ans=0, res=0;
  cin >> m >> n;
  for (i = 1;i <= m;i++)
      cin >> a[i];
  for (i = 1;i <= n;i++)
  {
      cin >> qu[i];
      vis[qu[i]] = 1;//bool数组的运用,检索下标,确认存在。
  }
  for (i = 1;i <= m;i++) {
      if (!vis[i]) {
          ans = gcd(a[i], ans);
      }
  }
  for (i = n;i > 0;i--) {
      if (!qu[i]) {//注意这里
          res += ans;
          res %= mod;
      }
      else {
          ans = gcd(a[qu[i]], ans);
      }



  }
  cout << res;

  return 0;

}

这道题不简单,对于一组数据一组下标检索的问题可以依据这个模板进行解答,主要是先进行预处理最终版本的gcd,再倒序记入其他数gcd,最终输出取模。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务