站外题求调
  • 板块灌水区
  • 楼主My_Xuan
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/13 20:15
  • 上次更新2023/10/27 03:03:39
查看原帖
站外题求调
679265
My_Xuan楼主2022/11/13 20:15

题目大意:有一个大小为 nn 的正整数集合,一个好的数的定义为它至少是集合中的一个数的倍数,找出 11mm(包括 mm)中好的数的个数

输入:第一行两个整数,nnmm;第二行是 nn 个正整数,表示这个集合。

输出:一行答案。

数据规模与约定:设 aia_i 为集合中的数,对于 100100%的数据,1n16,m1015,1ai1031 ≤ n ≤ 16, m ≤ 10 ^ {15}, 1 ≤ a_i ≤ 10 ^ 3

MyCode

// 思路:容斥,O(2 ^ n),枚举一个子集S,ans += -1 ^ |S| - 1 * m / lcm (S) 
#include <bits/stdc++.h>
using namespace std;
#define ll long long

ll n, m, a[20], c[20], ans;
bool b[20];

ll gcd (ll x, ll y)
{
	if (x % y == 0) return y;
	return gcd (y, x % y);
}

ll lcm (int x)
{
	long long res = 1;
	for (int i = 1; i <= x; i++)
		res = res / gcd (a[c[i]], res) * a[c[i]];
	return res;
}

int dfs (int k, int r)
{
	for (int i = 1; i <= n; i++)
		if (!b[i] && c[k - 1] < i)
		{
			c[k] = i; b[i] = 1;
			if (k == r)
				ans += pow (-1, r - 1) * (m / lcm (r));
			else dfs (k + 1, r);
			b[i] = 0;
		}
}

int main ( )
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n; i++)
	{
		dfs (1, i);
		memset (b, 0, sizeof (b));
	}
	cout << ans << '\n';
	return 0;
}

但是,运行错误!求调

一周站外题求助了 N 次的蒟蒻

2022/11/13 20:15
加载中...