首页 > 代码库 > UVA 10542 - Hyper-drive(容斥原理)
UVA 10542 - Hyper-drive(容斥原理)
UVA 10542 - Hyper-drive
题目链接
题意:给定一些个d维的方块,给定两点,求穿过多少方块
思路:容斥原理,每次选出一些维度,如果gcd(a, b),就会穿过多少点,对应的就减少穿过多少方块,所以最后得到式子d1 + d2 + .. dn - gcd(d1, d2)..+gcd(d1, d2, d3)...
代码:
#include <cstdio> #include <cstring> typedef long long ll; int t, d, a[15]; int bitcount(int x) { int ans = 0; while (x) { ans += (x&1); x >>= 1; } return ans; } int gcd(int a, int b) { while (b) { int tmp = a % b; a = b; b = tmp; } return a; } int main() { int cas = 0; scanf("%d", &t); while (t--) { scanf("%d", &d); for (int i = 0; i < d; i++) scanf("%d", &a[i]); int tmp; for (int i = 0; i < d; i++) { scanf("%d", &tmp); a[i] -= tmp; if (a[i] < 0) a[i] = -a[i]; } ll ans = 0; for (int i = 0; i < (1<<d); i++) { int cnt = bitcount(i); int sum = 0; for (int j = 0; j < d; j++) { if (i&(1<<j)) sum = gcd(sum, a[j]); } if (cnt&1) ans += sum; else ans -= sum; } printf("Case %d: %lld\n", ++cas, ans); } return 0; }
UVA 10542 - Hyper-drive(容斥原理)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。