2018.11.01 neither_nor 的隨(rand)
阿新 • • 發佈:2018-11-05
任重而道遠
AC程式碼:
#include<bits/stdc++.h> using namespace std; const int Mod = 1e9 + 7; int f[1005], tmp[1005], rt[1005]; int read () { int x = 0, 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; } int mpow (int a, int b) { int rt = 1; for (; b; b >>= 1, a = 1ll * a * a % Mod) if (b & 1) rt = 1ll * rt * a % Mod; return rt; } int main () { freopen ("rand.in", "r", stdin); freopen ("rand.out", "w", stdout); int n = read (), m = read (), p = read (); for (int i = 1; i <= n; i++) {int a = read (); f[a]++;} int M = m; rt[1] = 1; while (M) { if (M & 1) { memset (tmp, 0, sizeof (tmp)); for (int i = 1; i < p; i++) for (int j = 1; j < p; j++) tmp[i * j % p] = (tmp[i * j % p] + 1ll * rt[i] * f[j] % Mod) % Mod; for (int i = 1; i < p; i++) rt[i] = tmp[i]; } M >>= 1; memset (tmp, 0, sizeof (tmp)); for (int i = 1; i < p; i++) for (int j = 1; j < p; j++) tmp[i * j % p] = (tmp[i * j % p] + 1ll * f[i] * f[j] % Mod) % Mod; for (int i = 1; i < p; i++) f[i] = tmp[i]; } int sww = 0; for (int i = 1; i < p; i++) sww = (sww + 1ll * rt[i] * i) % Mod; sww = 1ll * sww * mpow (mpow (n, m), Mod - 2) % Mod; printf ("%d\n", sww); return 0; }