首页 > 其他分享 >CF1925B A Balanced Problemset? 题解

CF1925B A Balanced Problemset? 题解

时间:2024-01-29 22:22:58浏览次数:31  
标签:gcd 题解 times 序列 因子 Balanced CF1925B ldots 公因数

CF1925B 题解

题目链接

Codeforces

Luogu

题目大意

有一个长度为 \(n\) 且和为 \(x\) 的正整数序列,询问该序列可能的最大公因数。

多测。

简要思路

首先先给出结论:

最终的答案一定是 \(x\) 的因数

接下来我通过两种方法证明:

一、类似于“更相减损法”

一个序列的 \(\gcd\) 等于该序列前缀和后的 \(\gcd\)。

即我们设该序列为 \(a_1,a_2,a_3,\ldots,a_n\)。

\(\gcd(a_1,a_2,a_3,\ldots,a_n) = \gcd(a_1,a_1+a_2,a_1+a_2+a_3,\ldots,a_1+a_2+a_3+\ldots+a_n) = \gcd(a_1,a_1+a_2,a_1+a_2+a_3,\ldots,x)\)

因为 \(\gcd\) 中含有 \(x\),且是最大公因数,因此最终答案一定是 \(x\) 的因数。

考虑证明 一个序列的 gcd 等于该序列前缀和后的 gcd 的正确性:

即证明 \(\gcd(A,B) = \gcd(A,A+B)\)。

我们用类似于“更相减损法”来证明。

我们设 \(A,B\) 的最大公约数为 \(g\),那么 \(A=ag,B=bg\)(其中 \(a,b\) 均为正整数)。

设 \(C=A+B\),则有 \(C=A+B=ag+bg=(a+b)g\)。

由于 \(a,b > 0\),所以 $a + b > 0 $,所以 \(A,B,C\) 三者的最大公因数为 \(g\)。

所以我们就证得结论:\(\gcd(A,B,C)=\gcd(A,C)=\gcd(A,A+B)=\gcd(A,B)\)

二、通过子序列来表示 \(x\)

我们设该序列为 \(a_1,a_2,a_3,\ldots,a_n\),该序列的最大公因数为 \(g\),则有 \(a_1=b_1\times g,a_2=b_2\times g,a_3=b_3\times g,\ldots,a_n=b_n\times g\)(其中 \(b\) 数组均为正整数)。

因为 \(x\) 为该序列的和,所以 \(x=a_1+a_2+a_3+\ldots+a_n=b_1\times g+b_2\times g+b_3\times g+\ldots+b_n\times g=(b_1+b_2+b_3+\ldots+b_n)\times g\)。

所以 \(g\) 一定是 \(x\) 的因子。

用人话来解释一下,就是通过 \(a\) 数组的值的乘法分配律得到 \(x\) 的值,然后 \(x\) 的值是由一个大于等于 \(n\) 的正整数 \(\times g\) 组成的,因此 \(g\) 一定是 \(x\) 的因子。

以上就是两种证明方法。

知道了答案一定是 \(x\) 的因子后,我们再来考虑什么样的因子可以作为答案。

现在我们考虑 \(x\) 的一个因子 \(d\),如果 \(n \times d \leq x\),则我们可以选择该序列为 \(d,d,d,\ldots,x-(n-1)\times d\),因为 \(d\) 为 \(x\) 的因子且 \(n \times d \leq x\),所以最后一个数 \(x-(n-1)\times d\) 还可以表示为 $(x / d-n-1)\times d $。

所以该序列的每个数都为 \(d\) 的倍数,因此 \(d\) 可能成为答案。

但如果当前的因子 \(d\) 使得 \(n\times d > x\),即 \(x/d<n\),那么我们就无法用 \(d\) 这个因子填满整个序列,因此无法对答案影响。

因此我们只需枚举 \(x\) 的因数并判断其是否满足 \(\times n \le x\) 即可。

但是要注意,\(1\leq x\leq 10^8\),所以我们不能直接枚举 \(1\) 到 \(x\),需要使用和判断质数中一样的思想——平凡因子分解的方法(即枚举到根号)来解决。

复杂度 \(O(T\sqrt x)\)。

完整代码

#include<bits/stdc++.h>
#define int long long
#define endl '\n'

int T,x,n;

signed main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);

	std::cin>>T;
	while(T--){
		std::cin>>x>>n;
		int maxn=-1;
		
		for(int i=1;i*i<=x;i++){//平凡因子分解
		    if(x%i==0){
		    	if(i*n<=x)maxn=std::max(maxn,i);
		    	if(x/i*n<=x)maxn=std::max(maxn,x/i);
			}
		}
		std::cout<<maxn<<endl;
	}

	return 0;
}

THE END.

THANK YOU.

标签:gcd,题解,times,序列,因子,Balanced,CF1925B,ldots,公因数
From: https://www.cnblogs.com/CheZiHe929/p/17995488

相关文章

  • 2024 USACO 题解
    BronzeSilverT1Question给你长度为\(n\)的序列\(c\),$0\lec_i\leC$。若当前位置为\(0\)则表示这个数未知,要求你填数使得序列字典序最小,并满足给出的\(q\)条限制\((a_j,h_j)\),使得\(C_{h_j}\)是第一个严格大于\(C_1\cdotsC_{a_j}\)的数。Solution我的方法叫......
  • CF1925D Good Trip 题解
    考虑分别计算\(p\)和\(q\)。按照期望的定义,\(q\)应该等于方案的总数,也就是\(s^k\),其中\(s\)表示一共有多少个不同的组。考虑如何求\(p\),我们先只计算第\(i\)组对\(p\)的贡献。如果第\(i\)组一共被选了\(1\)次,那么贡献为:\[g=f_i\timesC_{k}^{1}\times(s-1)^{......
  • P5208 [WC2019] I 君的商店 题解
    第一道黑题,发个题解。很好玩的一道交互题。题意有一个长为\(n\)的01字符串,保证至少有一个1,且已知1的数量的奇偶性。每次可以询问两个下标集合,返回哪个下标集合中1的个数更多(相同则可能返回其中任意的一个)。求该字符串,查询次数有限。题解我们约定a,b,c等......
  • 洛谷题解-[ABC286E] Souvenir
    https://www.luogu.com.cn/problem/AT_abc286_e题目描述NNN個の都市があり、いくつかの相異なる都市の間は一方通行の直行便によって移動することができます。どの直行便が存在するかはNNN個の長さNNNの文字列S1,S2,…,SNS_1,S_2,\ldots,S_NS1​,S2​,…,SN​......
  • P5208 [WC2019] I 君的商店 题解
    第一道黑题,发个题解。很好玩的一道交互题。题意有一个长为\(n\)的01字符串,保证至少有一个1,且已知1的数量的奇偶性。每次可以询问两个下标集合,返回哪个下标集合中1的个数更多(相同则可能返回其中任意的一个)。求该字符串,查询次数有限。题解我们约定a,b,c等......
  • 题解 [ABC338D] Island Tour
    【洛谷博客】被降智的一道简单题。题意\(n\)个岛屿,第\(i\)座桥连接\(i\)和\(i+1\)(第\(N\)座桥连接着\(1\)和\(N\))。有一条长度为\(M\)的旅游序列\(X\),你需要按照顺序依次经过这些点,选择断掉一座桥使得旅游经过的桥最少。分析设断掉第\(i\)座桥会因为绕行增......
  • P10114 [LMXOI Round 1] Size 题解
    题目链接:[LMXOIRound1]Size挺有意思的诈骗题,其实这类题都喜欢批一个外壳,例如数据范围提示之类的。记得以前遇到的很多诈骗题,有一道cf的高分题,问的是区间出现次数的次数\(mex\),这玩意一开始感觉好难,出现次数还简单,还要考虑次数的次数,所以带修莫队的时候,一直没法确定怎么解决......
  • NOI 2017 蚯蚓排队 题解
    Meaning给定一些数字,对它们进行首尾相接和断开两种操作。对于每次询问,求对于每个数字,其后长度一定的数字串在给定数字串中出现的次数,并给出这些次数之积。Soultion对于每次首尾相接或断开的操作,如果直接对断点或合点两侧的整个数字串进行操作,时间复杂度不可接受。由于每次查询......
  • CF1764H Doremy's Paint 2 题解
    题目链接:CF或者洛谷高分题,感觉挺有意思的题,值得一提的是这个题的\(1\)和\(3\)版本却是两个基础题。一开始以为跟这道差不多:P8512[YnoiEasyRound2021]TEST_152题解。后面重新读了一下发现一个有趣的点:也就是是说操作的\(val\)并不太好搞了,如果\(val\)确定就基......
  • P5400 [CTS2019] 随机立方体 题解
    题目链接点击打开链接题目解法参考cmd的博客好复杂的推式子题,而且三维的对我来说好难想象/ll首先二项式反演,把恰好\(k\)个变成求至少\(i\)个的方案数令极大格子有至少\(i\)个的方案数为\(f_i\),\(R=\min\{n,m,k\}\)特判掉\(k>R\)答案为\(0\)根据二项式反演,答案......