题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1836
//C++代码
#include<iostream>
using namespace std;
int n,m,ans,a[11];
int gcd(int a,int b){
return b==0? a:gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
void dfs(int x,int k,int tot){
if(x>0) ans+=k*m/tot;
for(int i=x;i<n;i++) dfs(i+1,-k,lcm(a[i],tot));
}
int main(){
while(cin>>n>>m){
for(int i=0;i<n;i++) cin>>a[i];
ans=0;
dfs(0,-1,1);
cout<<ans<<endl;
}
return 0;
}
本文提供了一道来自浙江大学在线评测系统的编程题(编号1836)的解答思路及C++实现代码。该题需要通过递归搜索结合数学方法(最小公倍数和最大公约数)来解决一个与数论相关的组合问题。

4万+

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



