GuGuFishtion HDU - 6390 (欧拉函数,容斥)
GuGuFishtion
\]
题意
给出定义\(Gu(a, b) = \frac{\phi(ab)}{\phi(a)\phi(b)}\)
求出\(\sum_{a=1}^{m}\sum_{b=1}^{n}Gu(a,b) (mod p)\)
思路
首先对于欧拉函数,我们知道欧拉函数的朴素式子为:\(\phi(n) = n*(1-\frac{1}{p1})*(1-\frac{1}{p2}) * ... * (1-\frac{1}{pn})\),\(pi\) 为 \(n\) 的质因子。
对于任意两个数 \(a,b\),令 \(g = gcd(a, b)\)
- 若 \(g != 1\),令 \(pi\) 为 \(a\) 特有的质因子,\(qi\) 为 \(b\) 特有的质因子,\(ti\) 为\(a,b\) 共有的质因子,那么将 \(Gu(a, b)\) 展开,就可以得到
Gu(a, b) &= \frac{\phi(ab)}{\phi(a)\phi(b)}\\
&= \frac{ab \prod(1-\frac{1}{pi}) \prod(1-\frac{1}{ti}) \prod(1-\frac{1}{qi}) }{a \prod(1-\frac{1}{pi}) \prod(1-\frac{1}{ti}) b \prod(1-\frac{1}{qi})\prod(1-\frac{1}{ti})} \\
&= \frac{1}{\prod(1-\frac{1}{ti})}
\end{aligned}
\]
现在我们设 \(x\),\(x\) 包括了所有的 \(ti\),那么就有
Gu(a, b) &= \frac{1}{\prod(1-\frac{1}{ti})} \\
&= \frac{x}{x\prod(1-\frac{1}{ti})} \\
&= \frac{x}{\phi(x)}
\end{aligned}
\]
\(x\) 也很好知道是多少,其实 \(g\) 就满足同时包括了所有 \(ti\) 的数,所以我们可以设 \(x = g\),就可以得到 \(Gu(a,b) = \frac{g}{\phi(g)}\)。
2. 若 \(g=1\),此时不存在 \(ti\),但这是 \(Gu(a, b)\) 展开后全部消掉了,所以答案为 \(1\),而 \(\frac{1}{\phi(1)}\) 也正好为 \(1\),所以也可以看成 \(Gu(a,b) = \frac{g}{\phi(g)}\)。
综合上述,\(Gu(a,b) = \frac{g}{\phi(g)}\)。
此时我们只要计算出 \(gcd(a, b) = x (a\in [1,m], b\in[1,n])\) 的对数,就可以直接计算答案了。
这里可以利用经典的莫比乌斯反演,也可以利用容斥原理。
令:
\(f(i)\) 表示 \(gcd\) 等于 \(i的倍数\) 的对数
\(g(i)\) 表示 \(gcd\) 等于 \(i\) 的对数
那么就有
g(i) = f(i) - \sum_{j=2}^{i*j<=min(n,m)} g(ij)
\]
如此倒着计算 \(g(i)\),就可以得出答案。
Hint
emmmm,这题其实有点卡常,要注意取模的次数和自然数逆元打表的姿势。
/***************************************************************
> File Name : a.cpp
> Author : Jiaaaaaaaqi
> Created Time : 2019年08月26日 星期一 16时58分58秒
***************************************************************/
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int>
typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 1e6 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std;
ll n, m;
int cas, tol, T;
int pri[maxn], phi[maxn];
bool ispri[maxn];
ll f[maxn], g[maxn], inv[maxn];
void handle() {
int mx = 1e6;
mes(ispri, 1);
tol = 0;
phi[1] = 1;
for(int i=2; i<=mx; i++) {
if(ispri[i]) {
pri[++tol] = i;
phi[i] = i-1;
}
for(int j=1; j<=tol&&i*pri[j]<=mx; j++) {
ispri[i*pri[j]] = 0;
if(i%pri[j] == 0) {
phi[i*pri[j]] = phi[i]*pri[j];
break;
} else {
phi[i*pri[j]] = phi[i]*(pri[j]-1);
}
}
}
}
int main() {
// freopen("in", "r", stdin);
handle();
inv[1] = 1;
scanf("%d", &T);
while(T--) {
ll p;
scanf("%lld%lld%lld", &n, &m, &p);
ll x = min(n, m);
for(int i=2; i<=x; i++) inv[i] = (p-p/i)*inv[p%i]%p;
for(int i=1; i<=x; i++) f[i] = (n/i)*(m/i)%p;
for(int i=x; i>=1; i--) {
g[i] = f[i];
for(int j=2; i*j<=x; j++) {
g[i] -= g[i*j];
if(g[i]<0) g[i]+=p;
}
}
ll ans = 0;
for(int i=1; i<=x; i++) {
ans += 1ll*g[i]*i%p * inv[phi[i]]%p;
ans %= p;
}
printf("%lld\n", ans);
}
return 0;
}
GuGuFishtion HDU - 6390 (欧拉函数,容斥)的更多相关文章
- hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion
http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不 ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1695 GCD(欧拉函数+容斥)
Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...
- HDU 1695 GCD 欧拉函数+容斥定理
输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...
- hdu1695(莫比乌斯)或欧拉函数+容斥
题意:求1-b和1-d之内各选一个数组成数对.问最大公约数为k的数对有多少个,数对是有序的.(b,d,k<=100000) 解法1: 这个能够简化成1-b/k 和1-d/k 的互质有序数对的个数 ...
- HDU1695-GCD(数论-欧拉函数-容斥)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法
题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...
- hdu 2654(欧拉函数)
Become A Hero Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 2824(欧拉函数)
The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 1395(欧拉函数)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- 备忘录(Memento)模式
备忘录模式又叫做快照模式或者Token模式. 备忘录对象是一个用来存储另一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来 ...
- Sitecore安全:访问权限
由于Sitecore使用Core数据库中的项来定义其用户界面,因此您可以对该数据库中的项应用访问权限,以控制对CMS功能的访问.最常见的是,将用户置于预定义的Sitecore客户端角色中 Siteco ...
- Tomcat安装及配置(Linux系统)
环境说明:Linux环境,CentOS 7版本. 第一步:下载tomcat 版本,下载地址:https://tomcat.apache.org/index.html 我用的是zip结尾的包 解压命令: ...
- ELK学习笔记之ELK6.0 X-pack设置用户名和密码
$ bin/elasticsearch-plugin install x-pack -> Downloading x-pack from elastic [=================== ...
- 一文搞懂 Flink 网络流控与反压机制
https://www.jianshu.com/p/2779e73abcb8 看完本文,你能get到以下知识 Flink 流处理为什么需要网络流控? Flink V1.5 版之前网络流控介绍 Flin ...
- swiper4基础
这段时间在公司实习做前端,感觉前端没学习到很多前端框架,接口那些都是写好的,只需要调用就好,感觉没什么好记的,唯一觉得有必要记的就是swiper轮播了,在前端做网站的时候经常用到swiper做公告,图 ...
- javascript Class.method vs Class.prototype.method(类方法和对象方法)
在stackoverflow上看到一个这样的提问,以下代码有什么区别? Class.method = function () { /* code */ } Class.prototype.method ...
- CSS 精灵技术(sprite)
一.精灵技术产生的背景 图所示为网页的请求原理图,当用户访问一个网站时,需要向服务器发送请求,网页上的每张图像都要经过一次请求才能展现给用户. 然而,一个网页中往往会应用很多小的背景图像作为修饰,当 ...
- consul:kv
consul除了提供了服务发现的功能,还是提供了kv store的功能,kv store可用于动态配置服务.协调服务.leader选举等场景. consul的kv提供了cli和http的两种接口: h ...
- Solr基础理论【倒排索引,模糊查询】
一.简介 现有的许多不同类型 的技术系统,如关系型数据库.键值存储.操作磁盘文件的map-reduce[映射-规约]引擎.图数据库等,都是为了帮助用户解决颇具挑战性的数据存储与检索问题而设计的.而搜索 ...