首页 > 其他分享 >莫反做题记

莫反做题记

时间:2024-07-24 16:07:02浏览次数:8  
标签:lfloor frac int sum 莫反 mu rfloor 题记

$\quad $ 一些(两个)常用结论:

\[\sum_{d|n} {\mu}(d)=[n=1] \]

\[\sum_{d|n}{\phi_n} =n \]

$\quad $ 反演公式:

给定函数 \(f(x)\) ,定义函数 \(g(n) ={\sum_{d|n}}{f(d)}\)

则有:

\[g(x) = \sum_{d|n}{\mu(d)f(\frac{x}{d})} \]

[POI2007] ZAP-Queries

即:
\begin{aligned}
ans&=\sum _{i=1}^{n}{\sum _{j=1}^{m}{[gcd(i,j)=d]}}\\
&=\sum _{i=1}^{\lfloor{\frac{n}{d}\rfloor}}{\sum _{j=1}^{\lfloor{\frac{m}{d}}\rfloor}{[gcd(i,j)=1]}}\\
&=\sum _{i=1}^{\lfloor{\frac{n}{d}\rfloor}}{\sum _{j=1}^{\lfloor{\frac{m}{d}}\rfloor}{\sum _{k|gcd(i,j)}{\mu(k)}}}\\
&=\sum _{k=1}^{\lfloor{\frac{n}{d} \rfloor}}{\mu(k)\sum _{i=1}^{\lfloor{\frac{n}{d}}\rfloor}}\sum _{j=1}^{\lfloor{\frac{m}{d} \rfloor} }{[k|i][k|j]}\\
&=\sum _{k=1}^{\lfloor {\frac{n}{d}} \rfloor}{\mu(k){\lfloor{\frac{n}{kd}\rfloor}{\lfloor{\frac{m}{kd}}\rfloor}}}
\end{aligned}

$\quad $ 然后再除法分块即可。

点击查看代码
#define yhl 0
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+100;
int miu[N],prime[N],tot,t,n,m,d;
bool vis[N];
void get_miu(){
	miu[1]=1;vis[1]=1;
	for(int i=2;i<N;i++){
		if(!vis[i])prime[++tot]=i,miu[i]=-1;
		for(int j=1;j<=tot&&i*prime[j]<N;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j])miu[i*prime[j]]=-miu[i];
			else{
				miu[i*prime[j]]=yhl;break;
			}
		}
	}
	for(int i=1;i<N;i++)miu[i]+=miu[i-1];
}
int ghfz(int n,int m){
	int ans=yhl,r=yhl;
	for(int i=1;i<=n;i=r+1){
		r=min(n/(n/i),m/(m/i));
		ans+=(miu[r]-miu[i-1])*(n/i)*(m/i);
	}
	return ans;
}
int main(){
	get_miu();
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&n,&m,&d);
		n/=d,m/=d;if(m<n)swap(n,m);
		printf("%d\n",ghfz(n,m));
	}
	return yhl;
}

$\quad $ \(三倍经验\) 双亲数 [HAOI2011] Problem b,后面这个拿容斥搞一下即可。

YY的GCD

\begin{aligned}
ans&=\sum _{i=1}^{n}{\sum _{j=1}^{m}{[gcd(i,j)=p,p\in prime]}}\\
&=\sum _{p \in prime }{\sum _{i=1}^{n}{\sum _{j=1}^{m}{[gcd(i,j)}=p]}}\\
&=\sum _{p \in prime}{\sum _{i=1}^{\lfloor {\frac{n}{p}} \rfloor}}{\sum _{j=1}^{\lfloor {\frac{m}{p}}\rfloor}}{[gcd(i,j)=1]}\\
&=\sum _{p \in prime}{\sum _{i=1}^{\lfloor {\frac{p}{p}}\rfloor}}{\sum _{j=1}^{\lfloor {\frac{m}{p}} \rfloor}}{\sum _{k|gcd(i,j}}{\mu (k)}\\
&=\sum _{p \in prime}{\sum _{k=1}^{\lfloor {\frac{n}{p}} \rfloor}}{\mu(k)}{\sum _{i=1}^{\lfloor {\frac{n}{p}}{\rfloor}}}{[k|i]}{\sum _{j=1}^{\lfloor {\frac{m}{p}\rfloor}}}{[k|j]}\\
&=\sum _{p \in prime}{\sum _{k=1}^{\lfloor {\frac{n}{p}}\rfloor}}{\mu(k)\lfloor {\frac{n}{pk}} \rfloor}{\lfloor {\frac{m}{pk}} \rfloor}
\end{aligned}

$\quad $ 令 \(T=pk\) ,再变为枚举 \(T\) 则:

\begin{aligned}
ans&=\sum _{T=1}^{n}{\lfloor {\frac{n}{T}} \rfloor \lfloor{\frac{m}{T}\rfloor}}{\sum _{k|T,k\in prime}}{\mu(\frac{T}{k})}
\end{aligned}
$\quad $ 后面部分预处理出来,然后拿前缀和维护一下即可,再用根号分治就好了。

点击查看代码
#define yhl 0
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e7+100;
int miu[N],prime[N],tot,t,n,m,d,f[N],s[N];
bool vis[N];
void get_miu(){
	miu[1]=1;vis[1]=1;
	for(int i=2;i<N;i++){
		if(!vis[i])prime[++tot]=i,miu[i]=-1;
		for(int j=1;j<=tot&&i*prime[j]<N;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j])miu[i*prime[j]]=-miu[i];
			else{miu[i*prime[j]]=yhl;break;}
		}
	}
	for(int i=1;i<=tot;i++)
		for(int j=1;j*prime[i]<N;j++)
			f[j*prime[i]]+=miu[j];
	for(int i=1;i<N;i++)s[i]=s[i-1]+f[i];
}
int ghfz(int n,int m){
	int ans=yhl,r=yhl;
	for(int i=1;i<=n;i=r+1){
		r=min(n/(n/i),m/(m/i));
		ans+=(s[r]-s[i-1])*(n/i)*(m/i);
	}
	return ans;
}
signed main(){
	get_miu();
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld",&n,&m);
		if(m<n)swap(n,m);
		printf("%lld\n",ghfz(n,m));
	}
	return yhl;
}

[SDOI2015] 约数个数和

$\quad $ 即 \(ans=\sum _{i=1}^{n}{\sum _{j=1}^{m}{d(ij)}}\) ,其中 \(d(x)\) 为 \(x\) 的约数个数。

$\quad $ 一个结论:\(d(ij)=\sum _{a|i}{}\sum _{b|j}{[gcd(a,b)=1]}\) ,证明我也不知道

标签:lfloor,frac,int,sum,莫反,mu,rfloor,题记
From: https://www.cnblogs.com/0shadow0/p/18320595

相关文章

  • Codeforces Round 961 (Div. 2) 补题记录(A~D)
    上大分,赢!A考虑将每一条对角线上可以存放的砝码数量都记录一下,从大到小排序,然后直接暴力贪心选择。此时可以发现数量一定形如\(n,n-1,n-1,n-2,n-2,n-3,n-3,\ldots,1,1\)这样的形式。直接暴力减即可。时间复杂度为\(O(n)\)。#include<bits/stdc++.h>#defineintlonglong......
  • AtCoder Beginner Contest 363 补题记录(A~F)
    难度:A<B<C<E≈F<<D做题顺序:A->B->C->F->E->D其实VP的时候perf还是有\(2000+\)的(虽然说D炸了),perf应该是\(2028\)左右Asignedmain(){intn;cin>>n;intcnt=0;do{++cnt;++......
  • Codeforces Round 960 (Div. 2) 补题记录(A~D)
    打的稀烂,但是还是上分了(A考虑对值域做一个后缀和。若某一个后缀和的值是奇数那么先手就可以获胜。否则就不可以获胜。(我才不会告诉你我这题吃了一次罚时的)#pragmaGCCoptimize(3)#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intmysqrt(intx){......
  • 【组合总和】python刷题记录
    目录思路:回溯法框架:本题中(元素不可重复可复选)如果不重复使用重复使用代码:​拓展1:元素无重复不可复选子集问题:组合问题:全排列问题:拓展2:元素可重复不可复选再--子集问题:PS:润到递归了。下面是超级回溯大法!!!!!思路:使用回溯法解决问题----能够穷举所有解回溯法框架:......
  • CodeForces Round #959 sponsored by NEAR (Div. 1 + Div. 2) 补题记录(A~E)
    简单场.pngA若\(n\timesm=1\)则显然无解。否则因为\(a\)矩阵是一个\(n\timesm\)的排列,所以说只需要让其循环右移一位即可。时间复杂度\(O(nm)\)。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=500100;inta[233][233];sign......
  • 2024.7 做题记录 2 / 顾影自怜了几回 直到看见妄自蕤
    CF653E不难发现其实就是在假想中建立出可以存在的边的图,要求跟\(1\)相连的连通块个数\(\leqk\)且与\(1\)的连边个数\(\geqk\)且全图联通,这个我们只需要知道其去掉\(1\)的连通性就很好讨论了。我们其实不能直接建出这个极度稠密的图,但是我们可以用数据结构优化建图,......
  • 写题记录1
    懒得每道题都开一个随笔,所以就放一个里面。这些大概是2023的,先合并过来。CF1806ETreeMaster我们分析题目中用粗体标注的一个条件:每次给出的\(x_{i}\)和\(y_{i}\),它们深度相同。这就表明一个点的权值只会和与它处于同一深度的任意一个点相乘,这就减少了相乘点对的组数,也......
  • 算法力扣刷题记录 五十一【654.最大二叉树】
    前言二叉树篇,继续。记录五十一【654.最大二叉树】一、题目阅读给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的......
  • 算法力扣刷题记录 五十【106.从中序与后序遍历序列构造二叉树】和【105.从前序与中序
    前言记录三十八的四、二叉树构建通过层序遍历的数组实现。层序遍历中,某个节点下标是i,那么左孩子的下标2i+1,右孩子的下标2i+2。这是统一的规律。那么通过中序序列和后序序列如何构造二叉树?通过中序序列和前序序列如何构造二叉树?通过前序序列和后序序列如何构造二叉树?一......
  • Npoi 复制行的问题记录
    最近在做Excel模板数据导出,要求在Excel展示数据分页结果,做分页时发现npoi复制行有个bug【这种情况并不会百分百复现,sheet.CopyRow,备注下面的那一列还是会正常被复制显示完整的】,本来第一行的文字在A1下是可以完全显示的,但是复制的第二页之后,就不会完整显示了,如下经过调查,原因是......