绝世【】题

· · 算法·理论

(这文章太神秘被投休闲娱乐了)

神秘 jsy 题单的神秘投稿

原题目描述:

你这家伙在说什么呢

化简

S = \{d,r,e,a,m\},那么分子为

G_1=\prod_{T\subset S,|T|=3}\gcd(T)

分母前一段为

G_2^3,G_2=\gcd(\{x|x=\operatorname{lcm}(T),T\subset S,|T|=2\})

后面是

G_3=\gcd(\{x|x=\operatorname{lcm}(T),T\subset S,|T|=3\})

v_p(x) 表示 p 这个质数在 x 中的指数,那么根据

v_p(\gcd(x,y))=\min(v_p(x),v_p(y)),v_p(\operatorname{lcm}(x,y))=\max(v_p(x),v_p(y))

对于某一质数 p,简写 v_x=v_p(x),则在 G_1 中的指数就是

g_1=\sum_{T\subset S,|T|=3}\min\{v_x:x\in T\}

G_2 中就是

g_2=\min_{\{i,j\}\subset S}\max(v_i,v_j)

G_3 中就是

g_3=\min_{T\subset S,|T|=3}\max\{v_x:x\in T\}

于是原分数对 p 的指数就是

A=g_1-3g_2-g_3

v_d,v_r,v_e,v_a,v_m 进行排序,得到 a_1\le a_2\le a_3\le a_4\le a_5,则

g_1 & = & 6a_1+3a_2+a_3 \\ g_2 & = & a_2 \\ g_3 & = & a_3 \end{array}

于是

A=g_1-3g_2-g_3=6a_1

对于每个质数 p,原分数中 p 的指数都是 \min{v_p(x)},于是原分数就是

\prod_{p\in P}p^{6\min\{v_p(x),x\in S\}}=\gcd(S)^6

wow 好好看

正戏开始,令 g(x)=x^6

\begin{aligned} 原式 & =\sum_{d=1}^D\sum_{r=1}^R\sum_{e=1}^E\sum_{a=1}^A\sum_{m=1}^M\gcd(d,r,e,a,m)^6 \\ & = \sum_{d=1}^D\sum_{r=1}^R\sum_{e=1}^E\sum_{a=1}^A\sum_{m=1}^Mg(\gcd(d,r,e,a,m)) \\ & = \sum_{d=1}^D\sum_{r=1}^R\sum_{e=1}^E\sum_{a=1}^A\sum_{m=1}^M\sum_{x|\gcd(d,r,e,a,m)}f(x) \\ \end{aligned}

这里 f(x)g(x) 的狄利克雷逆,即 g(x)=\sum_{d|x}f(d),由于 g(x)=x^6,那么 f(x)=\sum_{d|x}\mu(d)(\frac{x}{d})^6,发现 f(x) 可以线性筛

交换一下求和顺序

原式=\sum_{x=1}^{\min(D,R,E,A,M)}f(x)\left\lfloor\frac{D}{x}\right\rfloor\left\lfloor\frac{R}{x}\right\rfloor\left\lfloor\frac{E}{x}\right\rfloor\left\lfloor\frac{A}{x}\right\rfloor\left\lfloor\frac{M}{x}\right\rfloor

看起来人畜无害多了,是五个整除分块,于是就能写了

代码

卡常卡一晚上没卡过,干脆不卡了,如果你想你可以试试,下面的代码只能过43pts

#include <bits/stdc++.h>
#define eps 1e-12
#define inf LONG_LONG_MAX
#define endl '\n'
using namespace std; 
#define ll long long

const int maxn = 5e7 + 10, mod = 1e9 + 7; 
int pr[maxn], ntp[maxn], f[maxn], cnt;
int get(int x) {
    x = (ll)x * x % mod;
    return (ll)x * x % mod * x % mod;
}
void init() {
    f[1] = 1;
    for (ll i = 2; i < maxn; i++) {
        if (!ntp[i]) pr[++cnt] = i, f[i] = get(i) - 1;
        for (int j = 1; j <= cnt && i * pr[j] < maxn; j++) {
            ntp[i * pr[j]] = 1;
            f[i * pr[j]] = (ll)f[i] * get(pr[j]) % mod;
            if (i % pr[j] == 0) break;
            if ((f[i * pr[j]] -= f[i]) < 0) f[i * pr[j]] += mod;
        }
    }
    for (int i = 1; i < maxn; i++) if ((f[i] += f[i - 1]) >= mod) f[i] -= mod;
}
signed main() {
    ios::sync_with_stdio(0); 
    cin.tie(0), cout.tie(0); 
    init();
    int t;
    cin >> t;
    while (t--) {
        ll d, r, e, a, m;
        cin >> d >> r >> e >> a >> m;
        ll ans = 0;
        for (ll l = 1, _r; l <= min({d, r, e, a, m}); l = _r + 1) {
            _r = min({d / (d / l), r / (r / l), e / (e / l), a / (a / l), m / (m / l)});
            (ans += (ll)(f[_r] - f[l - 1] + mod) * (d / l) % mod * (r / l) % mod * (e / l) % mod * (a / l) % mod * (m / l) % mod) %= mod;
        }
        cout << ans << endl;
    }
    return 0; 
}

啊啊啊宝宝你是一个

\operatorname{lcm}(r,e),\operatorname{lcm}(r,a),\operatorname{lcm}(r,m),\operatorname{lcm}(e,a),\operatorname{lcm}(e,m),\operatorname{lcm}(a,m))^3\gcd(\operatorname{lcm}(d,r,e),\operatorname{lcm}(d,r,a),\operatorname{lcm}(d,r,m), \operatorname{lcm}(d,e,a),\operatorname{lcm}(d,e,m),\operatorname{lcm}(d,a,m),\operatorname{lcm}(r,e,a),\operatorname{lcm}(r,e,m),\operatorname{lcm}(r,a,m),\operatorname{lcm}(e,a,m))}