Nt_Tsumiki
2024-11-19 21:23:30
这不是我们 ARC185E 吗。
考虑沿用那一题的做法对于一个
我们维护一个容斥系数
正确性的话你考虑对于每个
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define N 1000005
#define LL long long
#define MOD 998244353
inline int R() {
int x=0; bool f=0; char c=getchar();
while (!isdigit(c)) f|=(c=='-'),c=getchar();
while (isdigit(c)) x=x*10+c-'0',c=getchar();
return f?-x:x;
}
template<typename T>
void W(T x,char Extra=0) {
if (x<0) putchar('-'),x=-x; if (x>9) W(x/10);
putchar(x%10+'0'); if (Extra) putchar(Extra);
}
using namespace std;
int n,a[N]; LL f[N],g[N],val[N];
int main() {
n=R();
for (int i=1;i<=n;i++) a[i]=R();
for (int i=2;i<=N;i++) {
val[i]=1-val[i];
for (int j=2*i;j<N;j+=i) val[j]+=val[i];
}
f[1]=1;
for (int i=1;i<n;i++) {
for (int j=1;j*j<=a[i];j++)
if (a[i]%j==0) {
if (j!=1) (g[j]+=f[i])%=MOD;
if (j!=a[i]/j) (g[a[i]/j]+=f[i])%=MOD;
}
for (int j=1;j*j<=a[i+1];j++)
if (a[i+1]%j==0) {
if (j!=1) (f[i+1]+=1ll*val[j]*g[j]%MOD)%=MOD;
if (j!=a[i+1]/j) (f[i+1]+=1ll*val[a[i+1]/j]*g[a[i+1]/j]%MOD)%=MOD;
}
}
W((f[n]+MOD)%MOD,'\n');
return 0;
}
容易发现