UVA

来源:互联网 发布:原生js手风琴效果 编辑:程序博客网 时间:2024/06/05 09:40

题目:


代码:

#include<iostream>using namespace std;int gcd(int a, int b){if (b)return gcd(b, a%b);return a;}int main(){int n, m, l[15], s;while (cin >> n >> m){s = 0;for (int i = 0; i < m; i++)cin >> l[i];for (int k = 0; k < (1 << m); k++){long long r = 1, b = 0;for (int i = 0; i < m; i++)if (k&(1 << i)){if (r <= n)r *= l[i] / gcd(l[i], r);b++;}if (b % 2)s -= n/r;else s += n/r;}cout << s << endl;}return 0;}

用了状态压缩来枚举2^m种状态,用k对应状态

注意一个细节,当r超过n时,r/n就已经是0了,就不要再继续求lcm了,否则会越界,因为多个数的lcm很容易超过long long的范围