首页 > 其他分享 >数论好题 CF900D

数论好题 CF900D

时间:2024-01-16 11:44:46浏览次数:27  
标签:dots frac 数论 sum 个数 好题 int ans CF900D

前置推导

令 \(b_1 = \frac{a_1}{x},b_2 = \frac{a_2}{x},\dots,b_n = \frac{a_n}{x}\) 。

很显然 \(b_i\) 为整数,且 \(b\) 数组的全部元素互质,即 \(gcd(b_1,b_2,b_3,\dots,b_n) = 1\)。

因为

\[\sum_{i = 1}^{n} a_i = y \]

所以

\[x\times\sum_{i = 1}^{n} b_i = y \]

\[\sum_{i = 1}^{n} b_i = \frac{y}{x} \]

根据 \(整数\) \(+\) $ 整数 $ \(=\) \(整数\) 的封闭法则且 \(b_i\) 为整数,可得 \(\frac{y}{x}\) 也是整数。所以当 \(x \nmid y\) 时一定无解。

令 $ m = \frac{y}{x} $,则

\[\sum_{i = 1}^{n} b_i = m \]

大致思路

我们现在的目标是求出 \(b\) 数组,满足所有元素互质。直接这样看上去很难求,我们考虑正难则反,利用容斥原理解决,即先假设 \(b\) 数组中的元素不一定满足两两互质的个数,然后计算出 \(gcd(b_1,b_2,\dots,b_n) = d\) 且 \(d \ne 1\) 的个数。再用总个数减去不满足条件的个数就是满足条件的个数。

总个数

先来计算总个数,显然我们当前求解的问题相当于求 \(m\) 的所有本质不同的拆分总方案数。

因为

\[m = \underbrace{1 + 1 + \dots + 1}_{m} \]

所以可以考虑插板法,设当前要把 \(m\) 拆为 \(i\) 个数相加,所以此时方案数为$ \binom{m - 1}{i - 1} $。

方法 \(1\)(暴力)

所以总方案数为

\[\sum_{i = 1}^{m} \binom{m - 1}{i - 1} \]

根据二项式定理

\[(a+b)^n = \sum_{i = 0}^{n} \binom{n}{i} \times a^{n - i}\times b^{i} \]

\[a = 1,b = 1 \]

\[\sum_{i = 0}^{m - 1} \binom{m - 1}{i} \times 1 \times 1 = \sum_{i = 1}^{m} \binom{m - 1}{i - 1} \]

所以

\[\sum_{i = 1}^{m} \binom{m - 1}{i - 1} = (1 + 1)^{m - 1} = 2^{m - 1} \]

方法 \(2\)(人类智慧)

因为空位只有选和不选两种情况,一共有 \(m - 1\) 个空位,所以总方案数为 \(2 ^ {m - 1}\)

不满足条件的个数

令函数 $f(x) $ 表示 $ \sum_{i = 1}^{n} b_i = x $ 且 \(gcd(b_1,b_2,b_3,\dots,b_n) = 1\) 的个数。考虑怎么递推 \(f(x)\),我们很容易地发现和为 \(m\) 且 \(gcd(b_1,b_2,b_3,\dots,b_n) = d\) 的个数为 \(f(\frac{m}{d})\)显然 \(d|m\)。

所以

\[\sum_{d|x} f(\frac{x}{d}) = 2 ^ {x - 1} \]

再根据容斥原理得

\[f(x) = 2^{x - 1} - \sum_{d|x,d \ne 1} f(\frac{x}{d}) \]

\[f(x) = 2^{x - 1} - \sum_{d|x,d \ne x} f(d) \]

求解

递归求解 $ f(x) $ 即可。

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

\(Code\)

#include <bits/stdc++.h>
#define int long long
#define Add(x, y) x = add(x, y)
#define Mul(x, y) x = mul(x, y)

std :: map <int, int> ans;
int x, y; const int mod = 1e9 + 7;
int mul(int x, int y) { return x * y % mod; }
int add(int x, int y) { return (x + y) % mod; }

int qpow(int x, int y) {
	int ans = 1;  while(y) {
		if(y & 1) ans = mul(ans, x);
		x = mul(x, x), y >>= 1;
	} return ans;
}

int calc(int o) {
	if(o == 1) return 1;
	if(ans[o]) return ans[o];
	int res = calc(1); 
	for(int i = 2; i * i <= o; ++ i) {
		if(o % i) continue;
		Add(res, add(calc(i), (i * i != o) * calc(o / i))); 
	} return ans[o] = add(qpow(2, o - 1), -res);
}

signed main() {
	scanf("%lld%lld", &x, &y);
	if(y % x) return puts("0"); 
	printf("%lld", add(mod, calc(y / x)));
}

标签:dots,frac,数论,sum,个数,好题,int,ans,CF900D
From: https://www.cnblogs.com/wyb-blog/p/17967327

相关文章

  • 【做题笔记】数论做题笔记
    前言题目来源初等数论学习IEuclidProblem:板题,用\(exgcd\)求出的两个解就是\(|x|+|y|\)最小的整数解【模板】二元一次不定方程(exgcd):板题GiftDilemma:将方程变为\(ax+by\equivp-cz\),枚举\(c\)前的系数,若\(n=\frac{p}{c}\),那么时间复杂度为\(O(Tn\logn)\)[POI20......
  • 数论结论 总结
    数论结论总结小结论\(1\simn\)的因数总共有\(O(n\logn)\)个,调和级数证明。\[\varphi(ij)\varphi(\gcd(i,j))=\varphi(i)\varphi(j)\gcd(i,j)\]\[d(ij)=\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]\\d(ijk)=\sum_{x|i}\sum_{y|j}\sum_{z|k}[\gcd(x......
  • 快速数论变换 | NTT 初学
    快速数论变换|NTT初学前置FFT原根阶:称满足同余方程\(a^x\equiv1\modm\)的最小正整数解\(x\)为\(a\)的模\(m\)的阶,记为\(Ord_ma\)。观察到本质就是最短循环节,同时该同余方程类似于欧拉定理:\[a^{\varphi(m)}\equiv1\modm,a\botm\]那么显然两者的关系是......
  • Codeforces Round 651 (Div. 2)C. Number Game(数学思维数论)
    C.NumberGame我们考虑那些状态是必胜态我的回合时n为奇数(除1外),直接除以n则必胜下面偶数的情况稍复杂偶数我们能进行的操作只有除以一个奇数,需要考虑怎么把当前状态变为对手的必败态偶数一定含2的因子,\(n=2^k*q,q为奇数\)当\(k=1时如果q\)是一个质数那么只能除一次q这样......
  • 基础数论
    目录质数质因数分解约数\(gcd\)求最大公约数质数质因数分解算术基本定理:\(任何一个大于1的正整数都能唯一分解为有限个质数的乘积,可以写作:\)\[N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}\]\(其中c_i都是正整数,p_i都是质数,且满足p_1<p_2<...<p_m\)intprimes[N],cnt[N],m;voiddi......
  • 好题小记
    CF838D AirplaneArrangements题目传送门很高妙的题。直接计算不太好做,考虑把链首尾接起来拼成环,但注意到直接拼就无法判不合法,所以在$1$和$n$中间插入一个$n+1$号点,若$n+1$号点被覆盖则不合法。考虑对于所有方案计算$n+1$号点被覆盖的概率,注意到任意一种覆盖情况......
  • Educational Codeforces Round 159 (Rated for Div. 2) C. Insert and Equalize (贪心+
    EducationalCodeforcesRound159(RatedforDiv.2)C.InsertandEqualize思路:首先对\(a\)进行排序,然后对所有差值取gcd,获得可用的最大因子\(gc\),答案有两种情况:一种是\(a_{n+1}\)在$a_1\(~\)a_n$范围内,这时要获得最大的位置一种情况是$a_1\(~\)a_n$......
  • 数论学习笔记
    数论分块求\(\sumf(i)g(\biggl\lfloor\dfrac{n}{i}\biggr\rfloor)\),并且\(f(i)\)的前缀和可以快速计算。发现\(\biggl\lfloor\dfrac{n}{i}\biggr\rfloor\)的取值只有根号种,暴力做就完事了。问题是已知\(l\),怎么求出最大的\(r\)满足\(\biggl\lfloor\dfrac{n}{l......
  • 刷题 数论 组合数
    2023.12.7cf1907E 解题思路首先明确,如果这三个数加起来发生了进位,那么必然不是好数(一个位换下一个位总和会有损失)然后,结果n的每一位就可以拆成几个1,或者说几个小球,用两个隔板往小球的空隙插(注意因为0也有可能,所以小球两边也可插,可插空隙个数为num+2)然后就可以直接组合数,每......
  • 数论分块
    前言数论分块我实际上在2021年的暑假就已经接触过了,当时是当成了定理来记,所以现在忘得也差不多了。最近决定重温(从零开始重修)数论分块,利用坐地铁的时间看了几篇关于数论分块的博客文章(源自《洛谷日报》),感觉有些讲得不是非常详细,质量参差不齐。有些往往只放几个性质,然后将结论直......