-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathF_Omega_Numbers.cpp
More file actions
118 lines (98 loc) · 2.36 KB
/
F_Omega_Numbers.cpp
File metadata and controls
118 lines (98 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int N = 2e5 + 5;
int spf[N];
int omega[N];
void seive() {
for(int i=1;i<N;i++) spf[i] = i;
for(int i=2;i*i<N;i++) {
if(spf[i] == i) {
for(int j=i*i;j<N;j+=i) {
spf[j] = min(spf[j], i);
}
}
}
for(int i=1;i<N;i++) {
int cnt = 0, x = i, p = -1;
while(x != 1) {
int s = spf[x];
x /= s;
if(s != p) cnt++;
p = s;
}
omega[i] = cnt;
}
}
int modpowr(int a, int b) {
int res = 1;
while(b) {
if(b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
}
void solve() {
int n, k;
cin >> n >> k;
vector<int> v(n);
vector<int> freq(n + 1, 0);
for(int i=0;i<n;i++) {
cin >> v[i];
freq[v[i]]++;
}
// cnt_prs[d][s] // count of pairs whose gcd is d and sum of omega values is s
vector<vector<int>> cnt_prs(n + 1, vector<int>(15, 0));
for(int i = 1; i <= n; i++) {
vector<int> cnt(15, 0);
for(int j=i;j<=n;j+=i) {
if(freq[j] == 0) continue;
int w = omega[j];
cnt[w] += freq[j];
}
for(int u=0;u<=6;u++) {
cnt_prs[i][u+u] += (cnt[u] * (cnt[u] - 1)) / 2;
for(int v=u+1;v<=6;v++) {
int sum = u + v; //
cnt_prs[i][sum] += cnt[u] * cnt[v];
}
}
}
for(int i=n;i>0;i--) {
for(int j=2*i;j<=n;j+=i) {
for(int s=0;s<15;s++) {
cnt_prs[i][s] -= cnt_prs[j][s];
}
}
}
// w(x, y) = w(x) + w(y) - w(gcd(x, y))
// we know w(x) + w(y) = s and gcd(x, y) = d
// so w(x, y) = s - w(d)
vector<int> final_cnt(15, 0);
for(int i=1;i<=n;i++) {
int wd = omega[i];
for(int s=wd;s<15;s++) {
int prs = cnt_prs[i][s];
final_cnt[s - wd] += prs;
}
}
int ans = 0;
for(int w = 0; w < 15; w++) {
ans = (ans + (((final_cnt[w] % mod) * modpowr(w, k)) % mod)) % mod;
}
cout << ans << "\n";
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
seive();
int _;
cin >> _;
while (_-->0) {
solve();
}
return 0;
}