mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
1d53c6ce3d
4000-4099
77 lines
2.2 KiB
C++
77 lines
2.2 KiB
C++
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <algorithm>
|
|
#define MAXN 20010
|
|
int MOD;
|
|
using namespace std;
|
|
typedef long long LL;
|
|
int cas, n, m, tx;
|
|
int pri[MAXN], notp[MAXN], flag[MAXN], prs;
|
|
int tot[MAXN], maxm;
|
|
int fac[MAXN][305], facs[MAXN], phi[MAXN * 10];
|
|
void init(){
|
|
for (int i = 2; i < MAXN; i++) if (!notp[i]) {
|
|
flag[i] = 1;
|
|
for (int j = i*2; j < MAXN; j += i) {
|
|
if (!notp[j]) notp[j] = flag[j] = 1;
|
|
else if (flag[j]) flag[j]++;
|
|
if (j%(i*i) == 0) flag[j] = 0;
|
|
}
|
|
}
|
|
for (int i = 2; i < MAXN; i++)
|
|
if (!notp[i]) pri[prs++] = i;
|
|
for (int i = 1; i < MAXN; i++)
|
|
for (int j = 1; j * j <= i; j++) if (i % j == 0) {
|
|
fac[i][facs[i]++] = j;
|
|
if (j * j != i)fac[i][facs[i]++] = i/j;
|
|
}
|
|
const int maxn = 100000;
|
|
for (int i = 1; i <= maxn; i ++) phi[i] = i;
|
|
for (int i = 2; i <= maxn; i ++) if(phi[i] == i) {
|
|
for(int j = i; j <= maxn; j += i)
|
|
phi[j] = phi[j] / i * (i - 1);
|
|
}
|
|
}
|
|
int powmod(int x, int d){
|
|
int ans = 1, tmp = x;
|
|
for (; d; d >>= 1, tmp = (LL)tmp * tmp % MOD)
|
|
if (d&1) ans = (LL)ans * tmp % MOD;
|
|
return ans;
|
|
}
|
|
int cal(int l){
|
|
int ans = powmod(tot[1], l);
|
|
for (int i = 2; i <= maxm; i++) {
|
|
if (flag[i] == 0) continue;
|
|
if (flag[i] & 1) ans = (ans - powmod(tot[i], l)) % MOD;
|
|
else ans = (ans + powmod(tot[i], l)) % MOD;
|
|
}
|
|
return (ans % MOD + MOD) % MOD;
|
|
}
|
|
void solve(){
|
|
int ans = 0;
|
|
for(int i = 1; i * i <= n; i ++) if(n % i == 0) {
|
|
ans = (ans + (LL)cal(i) * phi[n / i]) % MOD;
|
|
if(i * i != n)
|
|
ans = (ans + (LL)cal(n / i) * phi[i]) % MOD;
|
|
}
|
|
printf("%d\n", (ans + MOD) % MOD / n);
|
|
}
|
|
int main(){
|
|
init();
|
|
scanf("%d", &cas);
|
|
while (cas--) {
|
|
scanf("%d%d", &m, &n);
|
|
MOD = 10007 * n;
|
|
memset(tot, 0, sizeof tot);
|
|
maxm = 0;
|
|
for (int i = 1; i <= m; i++) {
|
|
scanf("%d", &tx);
|
|
maxm = max(tx, maxm);
|
|
for (int j = 0; j < facs[tx]; j++)
|
|
tot[fac[tx][j]]++;
|
|
}
|
|
solve();
|
|
}
|
|
return 0;
|
|
}
|