luogu 4240 毒瘤之神的考验 (莫比乌斯反演)
题目大意:略
果然是一道神duliu题= =
出题人的题解还是讲得很明白的
1.关于$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\varphi (i,j)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\frac{\varphi (i)\varphi (j)gcd(i,j)}{\varphi (gcd(i,j))}$的证明,lgl神犇提供了一种方法
假设现在$gcd(i,j)$中有一个质因子$p$,幂次是$k$,那么它对$\varphi (gcd(i,j))$的贡献就是$p^{k-1}(p-1)$
设$i$中$p$的幂次是$k_{1}$,$j$是$k_{2}$。则他们对$\varphi (i),\varphi (j)$的贡献分别是$p^{k_{1}-1}(p-1)$和$p^{k_{2}-1}(p-1)$,相乘得$p^{k_{1}+k_{2}-2}(p-1)^{2}$
而$p$对$\varphi (ij)$的贡献是$p^{k_{1}+k_{2}-1}(p-1)$,所以$\frac{p^{k}}{p^{k-1}(p-1)}=\frac{p}{p-1}$
$\frac{p}{p-1}*p^{k_{1}+k_{2}-2}(p-1)^{2}=p^{k_{1}+k_{2}-1}(p-1)$
而质因子间互不影响,因此得证
2.对于最后化简出来的式子$\sum\limits_{Q=1}^{n} \left ( \sum\limits_{d|Q}\frac{d}{\varphi (d)}\mu(\frac{Q}{d}) \right ) \left ( \sum\limits_{i=1}^{\left \lfloor \frac{n}{Q} \right \rfloor} \varphi (iQ) \right ) \left ( \sum\limits_{i=1}^{\left \lfloor \frac{m}{Q} \right \rfloor} \varphi (jQ) \right )$ 的处理
整除分块不能同时处理两个定义域不同的函数相乘!
所以要把第一个式子$\left ( \sum\limits_{d|Q}\frac{d}{\varphi (d)}\mu(\frac{Q}{d}) \right )$ 按照常规方法进行整除分块,第二个式子$\left ( \sum\limits_{i=1}^{\left \lfloor \frac{n}{Q} \right \rfloor} \varphi (iQ) \right ) $和$\left ( \sum\limits_{i=1}^{\left \lfloor \frac{m}{Q} \right \rfloor} \varphi (jQ) \right )$用官方题解的方法处理
蒟蒻用$vector$写的常数巨大
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 100010
#define ll long long
#define dd double
using namespace std; const int B=;
const int maxn=;
const int jr=; void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){ x=; y=; return; }
exgcd(b,a%b,x,y); ll t=x; x=y; y=t-a/b*y;
}
int mu[N1],phi[N1],use[N1],pr[N1],cnt;
int f[N1],G[N1][B+][B+];
vector<int>g[N1];
void init()
{
int i,j,Q,n; mu[]=phi[]=;
for(i=;i<=maxn;i++)
{
if(!use[i]){ pr[++cnt]=i; mu[i]=-; phi[i]=i-; }
for(j=;j<=cnt&&i*pr[j]<=maxn;j++)
{
use[i*pr[j]]=;
if(i%pr[j]){ mu[i*pr[j]]=-mu[i]; phi[i*pr[j]]=phi[i]*phi[pr[j]]; }
else{ phi[i*pr[j]]=phi[i]*pr[j]; break; }
}
}
int ans=;ll inv,y;
for(Q=;Q<=maxn;Q++)
{
ans=;
for(i=;i*Q<=maxn;i++)
{
ans=(phi[i*Q]+ans)%jr;
g[Q].push_back(ans);
}
}
for(i=;i<=maxn;i++)
{
exgcd(phi[i],jr,inv,y); inv=(inv%jr+jr)%jr;
for(j=;j*i<=maxn;j++)
f[i*j]=(1ll*i*inv%jr*mu[j]%jr+f[i*j]+jr)%jr;
//sf[i]=(sf[i-1]+f[i])%jr;
}
for(Q=;Q<=maxn;Q++)
{
for(i=;i<=B;i++) for(j=;j<=B;j++)
G[Q][i][j]=(1ll*g[Q][i-]*g[Q][j-]%jr*f[Q]+G[Q-][i][j])%jr;
}
}
int n,m,T; int main()
{
scanf("%d",&T);
init();
int i,j,la;ll ans=;
while(T--)
{
scanf("%d%d",&n,&m); if(n>m) swap(n,m);
for(i=,ans=;i<=n&&m/i>B;i++)
ans=(ans+1ll*g[i][n/i-]*g[i][m/i-]%jr*f[i]%jr)%jr;
for(;i<=n;i=la+)
{
la=min(n/(n/i),m/(m/i));
ans=(ans+G[la][n/i][m/i]-G[i-][n/i][m/i]+jr)%jr;
}
printf("%lld\n",ans);
}
return ;
}
luogu 4240 毒瘤之神的考验 (莫比乌斯反演)的更多相关文章
- [luogu 4240] 毒瘤之神的考验
		
题目背景 Salamander的家门口是一条长长的公路. 又是一年春天将至,Salamander发现路边长出了一排毒瘤! Salamander想带一些毒瘤回家,但是,这时毒瘤当中钻出来了一个毒瘤之神! ...
 - Luogu4240 毒瘤之神的考验 莫比乌斯反演、根号分治
		
传送门 首先有\(\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\),把欧拉函数的定义式代入即可证明 ...
 - 洛谷 P4240 毒瘤之神的考验 解题报告
		
P4240 毒瘤之神的考验 题目背景 \(\tt{Salamander}\)的家门口是一条长长的公路. 又是一年春天将至,\(\tt{Salamander}\)发现路边长出了一排毒瘤! \(\tt{S ...
 - P4240 毒瘤之神的考验
		
题目 P4240 毒瘤之神的考验 神仙题\(emmm\) 前置 首先有一个很神奇的性质: \(\varphi(ij)=\dfrac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
 - 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)
		
洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...
 - Luogu 4240:毒瘤之神的考验
		
传送门 Sol 分开考虑 \(\varphi(ij)\) 中 \(ij\) 的质因子 那么 \[\varphi(ij)=\frac{\varphi(i)\varphi(j)gcd(i,j)}{\var ...
 - 从 [P4240 毒瘤之神的考验] 谈 OI 中的美学
		
感觉这题真的特别有意思,涉及了 OI 中很多非常有意思.非常美的手法,比如--平衡两部分的时间复杂度.\(n \ln n\) 的那个 Trick等等,真的一种暴力的美学. 题目大意: 多组询问,求 \ ...
 - 【Luogu】P3327约数个数和(莫比乌斯反演+神奇数论公式)
		
题目链接 真TM是神奇数论公式. 注明:如无特殊说明我们的除法都是整数除法,向下取整的那种. 首先有个定理叫$d(ij)=\sum\limits_{i|n}{}\sum\limits_{j|m}{}( ...
 - 洛谷P4240 毒瘤之神的考验  【莫比乌斯反演 + 分块打表】
		
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...
 
随机推荐
- Linux 命令未自动提示补全
			
解决方法: yum install -y bash-completion 退出当前界面,重新进入即可.
 - 在java中,怎样跳出当前的多重循环?
			
</pre>直接用break ;详细举比例如以下:<p></p><p></p><p></p><pre name ...
 - Python 远程调用MetaSploit
			
(1)安装Python的msgpack类库.MSF官方文档中的数据序列化标准就是參照msgpack. root@kali:~# apt-get install python-setuptools ro ...
 - java中tcp小样例
			
服务端: ServerSocket service = new ServerSocket(7777); Socket socket = service.accept(); InputStream in ...
 - windows XP下Python2.7包管理工具安装-setuptool,pip、distribute、nose、virtualenv
			
在Python开发中为了对项目进行管理和调试.必须安装一些特定的软件包.据说业内这个叫做yak shaving-做一个非常酷非常绚丽的Python项目之前,必须做的一些枯燥无味的准备工作.本文介绍了s ...
 - ETL (数据仓库技术)
			
ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.ETL一词较常用在数 ...
 - android 系统签名【转】
			
本文转载自:http://blog.csdn.net/csh86277516/article/details/73549824 Android——编译release版签名系统 AndroidManif ...
 - The Euler function(hdoj --2824-欧拉函数)
			
The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
 - 23. Merge k Sorted Lists[H]合并k个排序链表
			
题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...
 - C#控制台显示进度条
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Prog ...