首页 > 其他分享 >P3327 [SDOI2015]约数个数和

P3327 [SDOI2015]约数个数和

时间:2022-11-28 15:01:14浏览次数:41  
标签:约数 P3327 10000005 int sum leq SDOI2015

简要题意

\(T\) 组数据,每组数据给出 \(n,m\),计算:

\[\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d\mid ij}{1} \]

\(1 \leq T,n,m \leq 5 \times 10^4\)

思路

又是推式子好题,不过这一次需要莫比乌斯反演了。

\[\begin{aligned} &\textbf{下设 }n<m\\ &\because\sum_{d\mid ij}{1}=\sum_{x\mid i}\sum_{y\mid j}{[\gcd(x,y)=1]}\\ &\therefore\textbf{原式}=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d\mid ij}{\sum_{x\mid i}\sum_{y\mid j}{[\gcd(x,y)=1]}}\\ &=\sum_{x=1}^{n}\sum_{y=1}^{m}{\lfloor\dfrac{n}{x}\rfloor\lfloor\dfrac{m}{y}\rfloor[\gcd(x,y)=1]}\\ &\textbf{设原式为}{f(x)}\text{, }g(x)=\sum_{x\mid d}{f(d)}\\ &\textbf{则 }g(x)=\sum_{i=1}^{\lfloor n\div x\rfloor}\sum_{j=1}^{\lfloor m\div x\rfloor}\lfloor\dfrac{n}{ix}\rfloor\lfloor\dfrac{m}{jx}\rfloor\\ &\textbf{答案为} f(1)\\ &\textbf{根据莫比乌斯定理得 }f(1)=\sum_{i=1}^{n}{\mu(i)g(i)}\\ \end{aligned} \]

最后再用数论分块计算出 \(g\) 函数即可。

时间复杂度 \(O(Tn\sqrt{n})\)。

代码

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

int mu[10000005],vis[10000005],prime[10000005],qzh[10000005],tot;
int fk[10000005];

void sieve(){
	mu[1]=1;
	for(int i=2;i<=5e4;i++){
		if(!vis[i]){
			prime[++tot]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=tot&&i*prime[j]<=5e4;j++){
			vis[i*prime[j]]=1;
			if(!(i%prime[j])){
				break;
			}
			mu[i*prime[j]]-=mu[i];
		}
	}
	for(int i=1;i<=5e4;i++)qzh[i]=qzh[i-1]+mu[i];
	for(int x=1;x<=5e4;x++){
		int res=0;
		for(int i=1,j;i<=x;i=j+1){
			j=x/(x/i);
			res+=(j-i+1)*(x/i);
		}
		fk[x]=res;
	}
}

signed main(){
	sieve();
	int t;cin>>t;
	while(t--){
		int n,m;
		cin>>n>>m;
		if(n>m)swap(n,m);
		int ans=0;
		for(int i=1,j;i<=n;i=j+1){
			j=min(n/(n/i),m/(m/i));
			ans+=(qzh[j]-qzh[i-1])*fk[n/i]*fk[m/i];
		}
		cout<<ans<<'\n';
	}
	return 0;
}

标签:约数,P3327,10000005,int,sum,leq,SDOI2015
From: https://www.cnblogs.com/zheyuanxie/p/p3327.html

相关文章

  • 【数论】约数
    文章目录​​一、试除法求n的所有约数​​​​二、约数个数​​​​三、约数之和​​​​四、最大公约数(欧几里得算法/辗转相除法)​​一、试除法求n的所有约数vector<int>g......
  • 【Python】第4章-10 最大公约数和最小公倍数
    本题要求两个给定正整数的最大公约数和最小公倍数。输入格式:输入在一行中给出两个正整数M和N(≤1000)。输出格式:在一行中顺序输出M和N的最大公约数和最小公倍数,两数字......
  • Luogu P1306 斐波那契数列公约数
    斐波那契公约数题目描述对于Fibonacci数列:\[f_i=\begin{cases}[i=1]&i\leq1\\f_{i-1}+f_{i-2}&i\gt1\end{cases}\]请求出......
  • 51nod 1165 整边直角三角形的数量 【数学:公式--求约数】
    1165 整边直角三角形的数量基准时间限制:2 秒空间限制:131072 KB分值: 160 难度:6级算法题 收藏 关注直角三角形,三条边的长度都......
  • 求最大公约数
    #pragmawarning(disable:4996)#include<stdio.h>intmain(){intn=0;intm=0;intq=0;printf("请输入需要求最大公约数的两组数字:");scanf("%d%d",&n,&m......
  • 洛谷 P1403 约数研究
    洛谷P1403约数研究P1403约数研究-洛谷前置知识\(a\)能整除\(b\)用符号表示为\(b\mida\)\(1\simn\)中约数(即因子)含\(x\)的个数为\(\left\lfloor\df......
  • 利用递归求两个数的最大公约数
    #include<stdio.h>inthcf(intn1,intn2);intmain(){intn1,n2;printf("输入两个正整数:");scanf("%d%d",&n1,&n2);printf("%d和%d的最大公约数......
  • 最大公约数
    最大公约数欧几里得算法对于两个数\(a,b\),设\(a>b\),当\(a\%b==0\)时,答案为\(b\)。否则,设\(a=b*q+r,r<b\),则\(gcd(a,b)=gcd(b,a\%b)\),时间复杂度\(O(\logN)\)......
  • 220. 最大公约数
    题目链接220.最大公约数给定整数\(N\),求\(1\lex,y\leN\)且\(GCD(x,y)\)为素数的数对\((x,y)\)有多少对。\(GCD(x,y)\)即求\(x,y\)的最大公约数。输入格......
  • 区间最大公约数
    区间最大公约数给定一个长度为$N$的数列$A$,以及$M$条指令,每条指令可能是以下两种之一:Clrd ,表示把$A[l],A[l+1],\ldots,A[r]$都加上$d$。Qlr ,表示询问......