#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <map>
#include <cmath>
#include <math.h>
#include <cstdio>
#define LL long long
using namespace std;
const int MAXN = 1000000 + 10;
const int MOD = 998244353;
LL pow_mod(LL a, LL b)
{
LL res = 1;
while(b)
{
if(b & 1) res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res;
}
int A[MAXN], B[MAXN];
int dp[MAXN];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, k;
memset(B, 0, sizeof(B));
int Max = 0;
scanf("%d%d", &n, &k);
for(int i=1;i<=n;i++)
{
scanf("%d", &A[i]);
B[A[i]]++;
Max = max(Max, A[i]);
}
memset(dp, 0, sizeof(dp));
LL ans = 0;
for(int i=Max;i>=1;i--)
{
int c = 0;
for(int j=i;j<=Max;j+=i)
{
c += B[j];
if(j > i) dp[i] = (dp[i] - dp[j] + MOD) % MOD;
}
dp[i] = (dp[i] + pow_mod(2, c) - 1 + MOD) % MOD;
ans = (ans + pow_mod(i, k) * dp[i]) % MOD;
}
printf("%lld\n", ans);
}
return 0;
}
原文:http://blog.csdn.net/moguxiaozhe/article/details/45101009