OnlyPersistVictory DayFive

E

题意:
T T T组数据,给定 c , d , x c,d,x c,d,x,问有多少数对 ( a , b ) (a,b) (a,b)满足 c   ⋅ l c m ( a , b ) − d   ⋅ g c d ( a , b ) = x c\ ·lcm(a,b)-d\ ·gcd(a,b)=x c lcm(a,b)d gcd(a,b)=x
数据范围: 1 ≤ c , d , x ≤ 1 0 7 1\leq c,d,x\leq 10^7 1c,d,x107

题解:
对原式进行转换:
g = g c d ( a , b ) g=gcd(a,b) g=gcd(a,b),则 c   ⋅ a × b g − d   ⋅ g = x c\ ·\frac{a\times b}{g}-d\ ·g=x c ga×bd g=x
当然也可以得到: c   ⋅ a × b g × g − d = x g c\ ·\frac{a\times b}{g\times g}-d=\frac{x}{g} c g×ga×bd=gx
转换一下可得到: a × b g × g = x g + d c \frac{a\times b}{g\times g}=\frac{\frac{x}{g}+d}{c} g×ga×b=cgx+d

到这可以看清楚我们可以枚举 x x x的所有约数作为 g c d ( a , b ) gcd(a,b) gcd(a,b),然后可以得到一个值 v = a × b g × g v=\frac{a\times b}{g\times g} v=g×ga×b,由于除去了 g g g,故 a g \frac{a}{g} ga b g \frac{b}{g} gb是互质的。考虑将一个数 v v v分解质因数,共有 n n n个不同的质因子,故如果要保证对 v v v分解成两个互质的数,则分解得到的两个数的质因子不能有交集,因此质因子有两种分配选择,故每个 v v v对应的方案就是 2 n 2^n 2n

因此预处理出每个数的质因子个数即可,考虑埃筛筛出所有质因子即可。

注意由于这里的 v v v最大可能是两个 1 0 7 10^7 107级别的数之和,故需要筛到 2 × 1 0 7 2\times 10^7 2×107

代码:

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


typedef long long ll;

const int N = 2e7;
int cnt[N + 1];
int c, d, x;
ll ans;

void init() {
	for(int i = 2; i <= N; ++i)
		if(!cnt[i]) for(int j = i; j <= N; j += i)
			cnt[j] += 1;
}

ll cal(int g) {
	int num = d + (x / g);
	if(num % c) return 0;
	return 1ll << cnt[num / c];
} 

void solve() {
	ans = 0;
	scanf("%d%d%d", &c, &d, &x);
	for(int i = 1; i * i <= x; ++i) 
		if(x % i == 0) {
			ans += cal(i);
			if(i * i != x) ans += cal(x / i);
		}
	printf("%lld\n", ans);
}

int main()
{
	init();
	int T; scanf("%d", &T);
	while(T--) solve();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值