ARC185E 题解
KingPowers · · 个人记录
这个故事告诉我们看见
令
前半部分的
如果你跟我一样推莫反式子就会很复杂,考虑到有个著名的狄利克雷卷积式
代入上面的式子:
到这里就显而易见了,枚举
时间复杂度
#include<bits/stdc++.h>
#define int long long
#define For(i, a, b) for(int i = (a); i <= (b); i++)
#define Rof(i, a, b) for(int i = (a); i >= (b); i--)
#define deb(x) cerr << #x"=" << x << '\n';
using namespace std;
const int N = 5e5 + 5, mod = 998244353;
int n, a[N], f[N], g[N], pw[N];
vector<int> d[N];
int cnt, pri[N], phi[N];
bool isprime[N];
void sieve(int n){
isprime[1] = phi[1] = 1;
For(i, 2, n){
if(!isprime[i]) pri[++cnt] = i, phi[i] = i - 1;
for(int j = 1; j <= cnt && i * pri[j] <= n; j++){
isprime[i * pri[j]] = 1;
if(i % pri[j]) phi[i * pri[j]] = phi[i] * (pri[j] - 1);
else {phi[i * pri[j]] = phi[i] * pri[j]; break;}
}
}
pw[0] = 1;
For(i, 1, n) pw[i] = pw[i - 1] * 2 % mod;
}
void Solve(){
sieve(500000);
cin >> n;
For(i, 1, n){
cin >> a[i];
for(int j = 1; j * j <= a[i]; j++){
if(a[i] % j) continue;
d[i].push_back(j);
if(j * j != a[i]) d[i].push_back(a[i] / j);
}
}
int sum = 0;
For(i, 1, n){
f[i] = sum;
for(int x : d[i]) f[i] = (f[i] + phi[x] * g[x] % mod) % mod;
for(int x : d[i]) g[x] = (g[x] + pw[i - 1]) % mod;
sum = (sum + f[i]) % mod;
cout << sum << '\n';
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T = 1; //cin >> T;
while(T--) Solve();
return 0;
}