第二个RE,c++
查看原帖
第二个RE,c++
1122193
FarmerDrone楼主2024/2/23 22:45

记录

#include <bits/stdc++.h>
using namespace std;
vector <long long> v;
vector <long long> Ans; 
vector <bool> bl;
long long ans;
long long a0, a1, b0, b1;

long long p()
{
	long long P = 1;
	for (int i = 0; i < bl.size(); i++)
		if (bl[i])
			P *= v[i];
	return P;
}

inline long long gcd(long long a, long long b)
{
	if (b)
		while ((a %= b) && (b %= a));
	return a + b;
}

void dfs(int x)
{
	if (x > bl.size())
	{
		if (gcd(a0, b1 / b0 * p()) == a1 && b1 / b0 * p() * b0 / gcd(b1 / b0 * p(), b0) == b1)
		{
			bool f = 1;
			for (long long i = 0; i < Ans.size(); i++)
				if (p() == Ans[i])
				{
					f = 0;
					break;
				}
			if (f)
			{
				Ans.push_back(p());
				ans++;
			}
		}
		return;
	}
	bl[x] = 1;
	dfs(x + 1);
	bl[x] = 0;
	dfs(x + 1);
}

int main() 
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{ 
		ans = 0;
		scanf("%lld%lld%lld%lld", &a0, &a1, &b0, &b1);
		long long m = b0;
		v.resize(0);
		for (long long j = 2; j * j <= b0; j++)
			while (m % j == 0)
			{
				m /= j;
				v.push_back(j);
			}
		if (m != 1)
			v.push_back(m);
		bl.resize(v.size());
		Ans.resize(0);
		dfs(0);
		cout << ans << endl;
	}
	return 0;
}
2024/2/23 22:45
加载中...