费解的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,最终输出取模。
网易游戏公司福利 555人发布
