HDU 6390 GuGuFishtion

题意:

计算:

\[\sum\limits_{a = 1}^{m}\sum\limits_{b = 1}^{n} \frac{\varphi(ab)}{\varphi(a)\varphi(b)} (\bmod p)\]

思路:

考虑算术基本定理和\(\varphi(x)\)函数积性将式子化简:

\(a = p_1^{t_1}p_2^{t_2} \cdots p_n^{t_n}\)\(b = p_1^{q_1}p_2^{q_2} \cdots p_n^{q_n}\)

那么原式有:

\[ \begin{eqnarray*} \frac{\varphi(ab)}{\varphi(a)\varphi(b)} (\bmod p) = \frac{\varphi(p_1^{t_1 + q_1} \cdots p_n^{t_n + q_n})}{\varphi(p_1^{t_1} \cdots \varphi(p_n^{t_n})) \cdot \varphi(p_1^{q_1} \cdots p_n^{q_n})} (\bmod p) \end{eqnarray*} \]

我们单独考虑一下\(p_1\),那么有:

\[ \begin{eqnarray*} \frac{\varphi(p_1^{t_1 + q_1})}{\varphi(p_1^{t_1}) \cdot \varphi(p_1^{q_1})} = \frac{p_1^{t_1 + q_1} \cdot (1 - \frac{1}{p_1})} {p_1^{t_1} (1 - \frac{1}{p_1})\cdot p_1^{q_1}(1 - \frac{1}{p_1})} \end{eqnarray*} \]

我们令\(t_1 < p_1\),即\(p_1^{t_1}是gcd(a, b)\)的一部分,那么约分之后有:
\[ \begin{eqnarray*} \frac{p_1^{t_1}}{p_1^{t_1} (1 - \frac{1}{p_1})} \end{eqnarray*} \]

我们再同理考虑\(p_1 \cdots p_n\),我们发现分子刚好是\(gcd(a, b)\), 而分母是\(\varphi(gcd(a, b))\),即:
\[ \begin{eqnarray*} \frac{\varphi(ab)}{\varphi(a)\varphi(b)} (\bmod p) &=& \frac{\varphi(p_1^{t_1 + q_1} \cdots p_n^{t_n + q_n})}{\varphi(p_1^{t_1} \cdots \varphi(p_n^{t_n})) \cdot \varphi(p_1^{q_1} \cdots p_n^{q_n})} (\bmod p) \\ &=& \frac{gcd(a, b)}{\varphi(gcd(a, b))} \end{eqnarray*} \]

所以现在我们的问题转化成了求解:
\[ \begin{eqnarray*} \sum\limits_{a = 1}^{m}\sum\limits_{b = 1}^{n} \frac{gcd(a, b)}{\varphi(gcd(a, b))} (\bmod p) \end{eqnarray*} \]

\(gcd(a, b) = d\),并且令\(n <= m\),有:
\[ \begin{eqnarray*} \sum\limits_{a = 1}^{m} \sum\limits_{b = 1}^{n} \frac{d}{\varphi(d)} = \sum\limits_{d = 1}^{n} d \cdot \varphi(d)^{-1} \sum\limits_{a = 1}^{n} \sum\limits_{b = 1}^{m} [gcd(a, b) == d] \\ \end{eqnarray*} \]

我们令:
\[ \begin{eqnarray*} f(d) &=& \sum\limits_{a = 1}^{n} \sum\limits_{b = 1}^{m} [gcd(a, b) == d] \\ g(d) &=& \sum\limits_{d|x}f(x) \\ &=& \sum\limits_{a = 1}^{n} \sum\limits_{b = 1}^{m} [d | gcd(a, b)] \\ &=& \sum\limits_{a = 1}^{n/d}\sum\limits_{b = 1}^{m/d} [1 | gcd(a, b)] \\ &=& \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor \end{eqnarray*} \]
进行莫比乌斯反演,有:
\[ \begin{eqnarray*} f(d) &=& \sum\limits_{d|x} \mu(\frac{x}{d}) g(d) \\ &=& \sum\limits_{d|x} \mu(\frac{x}{d}) \cdot \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor \\ &=& \sum\limits_{x = 1}^{n/d} \mu(x) \cdot \lfloor \frac{n}{xd} \rfloor \lfloor \frac{m}{xd} \rfloor \\ \end{eqnarray*} \]

所以,原式为:
\[ \begin{eqnarray*} \sum\limits_{i = 1}^{n} i \cdot \varphi(i)^{-1} \sum\limits_{d = 1}^{n|i} \mu(d) \lfloor \frac{n}{id} \rfloor \lfloor \frac{m}{id} \rfloor \end{eqnarray*} \]
预处理逆元,\(\varphi()\)函数,\(\mu()\)函数,然后直接算即可。
复杂度为\(\sum\limits_{i = 1}^{n} \sqrt{(i)}\)

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define N 1000010
ll p;
int n, m;
int prime[N], mu[N];
int phi[N], inv[N], g[N];
bool check[N];

void init()
{
    memset(check, 0, sizeof check);
    prime[0] = 0;
    phi[1] = 1;
    mu[1] = 1;
    for (int i = 2; i < N; ++i)
    {
        if (!check[i])
        {
            prime[++prime[0]] = i;
            phi[i] = i - 1;
            mu[i] = -1;
        }
        for (int j = 1; j <= prime[0]; ++j)
        {
            if (1ll * i * prime[j] >= N)
                break;
            check[i * prime[j]] = 1;
            if (i % prime[j] == 0)
            {
                phi[i * prime[j]] = phi[i] * prime[j];
                mu[i * prime[j]] = 0;
                break;
            }
            else
            {
                phi[i * prime[j]] = phi[i] * (prime[j] - 1);
                mu[i * prime[j]] = -mu[i];  
            }
        }
    }
}

void work()
{
    inv[1] = 1;
    for (int i = 2; i <= n; ++i)
        inv[i] = 1ll * inv[p % i] * (p - p / i) % p;
    for (int i = 1; i <= n; ++i)
        g[i] = 1ll * i * inv[phi[i]] % p;
}

ll get(int n, int m)
{
    ll res = 0;
    for (int i = 1; i <= n; ++i)
        res = (res + 1ll * mu[i] * (n / i) * (m / i)) % p;
    return res;
}

int main()
{
    init();
    int T; cin >> T;
    while (T--)
    {
        scanf("%d %d %lld\n", &n, &m, &p);
        if (n > m) swap(n, m);
        work();
        ll res = 0;
        for (int i = 1; i <= n; ++i)
            res = (res + g[i] * get(n / i, m / i)) % p; 
        printf("%lld\n", res);
    }
    return 0;
}

转载于:https://www.cnblogs.com/Dup4/p/10665789.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值