题目链接
https://www.nowcoder.com/acm/contest/39/E
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define ll long long
using namespace std;
const int INF = ( 2e9 ) + 2;
const ll maxn = 1000000010;
ll a[22];
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
ll ans=0;
sort(a+1,a+1+n);
int len = unique(a+1,a+1+n) - (a+1);
ll s = 1<<len;
for(int i=1;i<s;i++)
{
int cnt=0;
int tmp = i;
ll mul=1;
for(int j=0;j<len;j++)
{
int bit = (tmp>>j)&1;
if(bit){
cnt++;
mul*=a[j+1];
}
}
if(cnt%2)ans += m/mul;
else ans -= m/mul;
}
printf("%lld",ans);
}
本文提供了一段针对ACM竞赛中特定算法问题的C++实现代码。该算法通过枚举子集并利用位运算来解决特定数学问题,具体涉及了排序、唯一化处理以及组合数学等概念。
668

被折叠的 条评论
为什么被折叠?



