首页 > 其他分享 >[ABC206E] Divide Both 的题解

[ABC206E] Divide Both 的题解

时间:2024-07-14 13:55:18浏览次数:8  
标签:Both le frac gcd int 题解 mid ne Divide

题目大意

求出从 \(l\) 至 \(r\) 中满足以下条件的 \((x,y)\) 的个数。

  • \(\gcd(x,y) \ne 1\) 且 \(\gcd(x,y)\ne x\) 且 \(\gcd(x,y)\ne y\)。

其中 \(1\le l\le r\le 10^6\)。

思路

正难则反,所以可以求出所有互质或者是相互倍数的 \((x,y)\) 的对数,在将其减去所有的方案数就是答案。

设 \(s_i\) 表示满足 \(\gcd(a,b)=i\) 而且 \(l\le a,b\le r\) 的数对 \((a,b)\) 的个数。

因为 \(\gcd(a,b)=i\),所有有 \(a,b\ge i\),而且有 \(i \mid a,i \mid b\)。

假设满足 \(x\in[l,r]\) 且 \(i \mid x\) 的数量为 \(num\),那么以 \(i\) 为公因数的个数就是 \(num\times (num-1)\)。

在以上的计算中 \(j\ge i\),且两数满足 \(i \mid a,i \mid b\),\(j \mid a,j \mid b\) 的情况在计算 \(s_i\) 和 \(s_j\) 的时候都会计算,所以求出的公因数而不是最小公因数。为了求出 \(i\) 为最大公因数时数对的个数,\(s_i\) 的计算方法应该向下面这样。

\[S_i=(\lfloor r/i\rfloor-\lceil l/i \rceil)\cdot (\lfloor r/i\rfloor-\lceil l/i \rceil-1)-\sum^{\lfloor r/i\rfloor}_{j=\lceil l/i \rceil}S_{j\times i} \]

其中 \(s_1\) 表示 \((x,y)\) 的 \(\gcd(x,y)=1\) 的数量,即 \(x,y\) 互质的数量。

对于是倍数的情况,枚举每一个数 \(i\),求出 \(j\in[l,r]\) 且 \(i \mid j\) 的所有的可能的 \(j\) 的数量,将答案减去就可以了。

因为如果 \(x \mid y\),那么在 \(x\ne 1,y\ne 1\) 的情况下,\(\gcd(x,y)=x\) 就不会与互质的情况重复计算。

时间复杂度为:

\[O(\frac{r}{1}+\frac{r}{2}+\frac{r}{3}+\cdots +\frac{r}{r-2}+\frac{r}{r-1}+\frac{r}{r})=O(r \log r) \]

AC Code

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=1e6+6;
int l,r,ans,s[N];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>l>>r;
	for(int i=r;i>=1;i--){
		int cnt=0,sum=0;
		for(int j=i;j<=r;j+=i){
			sum+=s[j];
			if(j>=l){
				cnt++;
			}
		}
		s[i]=cnt*(cnt-1)/2-sum;
	}
	int cnt=0;
	for(int i=max(l,2ll);i<=r;i++){
		for(int j=2*i;j<=r;j+=i){
			cnt++;
		}
	}
	int n=r-l+1;
	int ans=n*(n-1)/2;
	cout<<(ans-(cnt+s[1]))*2;
	return 0;
}

标签:Both,le,frac,gcd,int,题解,mid,ne,Divide
From: https://www.cnblogs.com/liudagou/p/18301458

相关文章

  • [CF1178D] Prime Graph 的题解
    题目大意构造一个简单无向图,是所有的有度的点的度都是质数而且总共的边的数量的个数是质数。思路因为需要让所有的入度都为质数,所以我们可以找到两个相邻的质数\(2,3\),因为这样即使增加了一条边那么这个节点的度也是质数。先将这个图构成一个巨大的环,接着如果所有的边数并不......
  • [CF1538F] Interesting Function 的题解
    题目大意给定两个正整数\(l,r\),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。\(1\lel<r\le10^9\)。思路假设从\(l\)处理到\(r\)变化的次数为\(f(l,r)\)。因为直接求解出\(f(l,r)\)十分困难,所以可以通过求出\(f(0,l)\)......
  • 题解:CodeForces 1511 C Yet Another Card Deck[暴力/模拟]
    CodeForces1511CC.YetAnotherCardDeckDescriptionYouhaveacarddeckof\(n\)cards,numberedfromtoptobottom,i. e.thetopcardhasindex\(1\)andbottomcard —index\(n\).Eachcardhasitscolor:the\(i\)-thcardhascolor\(a_i\......
  • 「ABC217F」Make Pair 的题解
    题目大意一共\(2N\)个学生站成一排,其中有\(M\)对朋友关系。老师每次从队列中挑出两个相邻的学生作为同桌。为了关系和睦,每次选出的两个学生必须是朋友关系。选出的两个学生离开队列,空出来的位置左右合拢。请问老师有多少种方式选完所有学生?对于两种选人的方案,即使同桌关系相......
  • [COCI2015-2016#6] PAROVI 的题解
    题意选择一些\(n\)一下互质的二元组\(\{a,b\}\),求对于任意\(x\in\big[2,n\big]\)都不满足\(a,b<x\)和\(a,b\gex\)的个数。简化题意因为无解的情况只发生在所有的\(\{a,b\}\)之间没有多余的位置用于放置\(x\),所以题意可以抽象成这样:选择一些区间互质的区间\([a......
  • [COCI2006-2007#4] ZBRKA 的题解
    题目大意在一个长度为\(n\)的排列中找出逆序对数量恰好为\(c\)的排列总数,其中\(1\len\le10^3,1\lec\le10^4\)。思路考虑将\(1\)到\(n\)这些数从小到大一次填进去,因为每一次填入的数多是最大的,所以逆序对增加的数量只与其所在的位置相关,所以设计\(f_{i,j}\)表......
  • Snow Walking Robot 的题解
    题目大意给你一个机器人和机器人的\(n\)个运动,要求你在给出的运动路径的基础上设计一种不会走重复的路径的方法,注意只能减少原来的步数而不能增加,其中\(1\len\le10^5\)。思路因为这道题目可以自由的配置路径并且要求机器人在最后回到原来的位置,那么就应该要到一种适合所有......
  • [EGOI2021] Luna likes Love 的题解
    题目大意有\(2\timesn\)个人站成一排,然后给每个人分配一个\(1\)至\(n\)之间的数字,每种数字出现\(2\)次。现在,你可以进行两种操作:删除操作,将数字相同且相邻的两人删除,删除后两端剩下的队列合并。交换操作,交换相邻两个人的位置。每次,问至少操作多少次能够删除所有人......
  • Unusual Minesweeper 题解
    题目大意给你\(n\)个炸弹,第\(i\)个炸弹在\((x_i,y_i)\)的位置,可以将这一行与这一列的距离小于\(k\)的其他所有炸弹引爆,而且连锁的引爆不需要时间。每一秒你可以引爆一个炸弹,其中第\(0\)秒也可以引爆,并且第\(i\)个炸弹在第\(timer_i\)的时候会自己爆炸。要求输出引......
  • [ARC115B] Plus Matrix 的题解
    题目大意给你一个\(n\timesn\)的数组\(C\),\(c_{i,j}=a_i+b_j\),求\(a\)数组与\(b\)数组,不保证有解,其中\(1\len\le500,1\lec_{i,j}\le10^9\),而且\(a_i,b_i\)都是非负整数。\[\begin{bmatrix}a_1+b_1&a_1+b_2&\cdots&a_1+b_{n-1}&a_1+b_n\\a_2+b_......