题意简述:给一个
如果不考虑颜色置换,枚举四个方向上置换走几步能走完
考虑一种排列的颜色置换,这种置换有用的不是置换本身,而是这个置换中的每个轮换的长度,考虑颜色置换中每一种轮换的长度,如果轮换长度
本题是要考虑所有排列的颜色置换,那么先将
最后除以置换方案种类数即可,别忘记除以颜色置换的方案种类数。
#include<bits/stdc++.h>
#define pow HA
typedef long long ll;
const int P = 1e9 + 7;
int A, B, C, D, col, cnt, temp[20], sp[250][20], phi[1001], a[100], b[100], c[100], d[100];
ll fac[20], kind[250], l, ans;
void dfs(int dep, int n, int last) {
if (n == 0) {
cnt++;
for (int i=1; i < dep; i++)
sp[cnt][temp[i]]++;
return;
}
for (int i=n; i >= last; i--)
temp[dep] = i,
dfs(dep + 1, n - i, i);
}
ll gcd(ll a, ll b) {if (b == 0) return a; return gcd(b, a % b); }
ll lcm(ll a, ll b) {return a * b / gcd(a, b); }
ll pow(ll x, ll k) {
ll ans = 1;
for (; k; k >>= 1, x = x * x % P)
if (k & 1ll) ans = ans * x % P;
return ans;
}
ll calc(ll x, int i) {
ll ans = 0;
for (int j=1; j <= col; j++)
if (x % j == 0)
ans += sp[i][j] * j;
return ans;
}
void find(int n, int a[]) {
for (int i=1; i * i <= n; i++)
if (n % i == 0)
a[++a[0]] = i,
a[++a[0]] = n / i;
if (a[0] > 1 && a[a[0] - 1] == a[a[0]]) a[0]--;
}
void solve() {
fac[0] = 1;
for (int i=1; i <= col; i++)
fac[i] = fac[i - 1] * i % P;
for (int i=1; i <= 1000; i++) {
int t = phi[i] = i;
for (int j=2; j * j <= t; j++)
if (t % j == 0) {
phi[i] = phi[i] / j * (j - 1);
while (t % j == 0) t /= j;
}
if (t > 1) phi[i] = phi[i] / t * (t - 1);
}
find(A, a); find(B, b); find(C, c); find(D, d);
for (int i=1; i <= cnt; i++) {
ll tans = 0;
for (int ai=1; ai <= a[0]; ai++)
for (int bi=1; bi <= b[0]; bi++)
for (int ci=1; ci <= c[0]; ci++)
for (int di=1; di <= d[0]; di++)
l = lcm(lcm(a[ai], b[bi]), lcm(c[ci], d[di])),
tans = (tans + (ll)phi[a[ai]] * phi[b[bi]] % P * phi[c[ci]] % P * phi[d[di]] % P
* pow(calc(l, i), (ll)A * B * C * D / l)) % P;
for (int j=1; j <= col; j++)
tans = tans * pow(pow(j, sp[i][j]) * fac[sp[i][j]] % P, P - 2) % P;
ans = (ans + tans * fac[col]) % P;
}
ans = ans * pow((ll)fac[col] * A % P * B % P * C % P * D % P, P - 2) % P;
printf("%lld\n",ans);
}
int main() {
scanf("%d%d%d%d%d",&A,&B,&C,&D,&col);
dfs(1, col, 1);
solve();
return 0;
}