Hyper-drive UVA - 10542

发布时间 2023-04-26 15:21:32作者: towboat

题意:给定一些个d维的方块,给定两点,求穿过多少方块

 

转化为(0,0) 到 (a,b)

先考虑二维的

 然后容斥原理

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N =103;
#define int long long
int a[N],b[N] ,n;
 int count(int i){
 	return i==0?0:count(i/2)+(i&1) ;
 }
 void sov(int cas){
 	int ans=0 ;
 	for(int i=0;i<(1<<n);i++){
 		int s=0;
 		int c=count(i);
 		for(int j=0;j<n;j++){
 			if(i&(1<<j)) s=__gcd(s,a[j]) ;
 		}
 		if(c&1) ans+=s;
 		else ans-=s;
 	}
 	printf("Case %d: %lld\n", cas, ans);
 }
 signed main(){
 	int tes;cin>>tes;
 	int cas=0 ;
 	while(tes--){
 		cin>>n;
 		for(int i=0;i<n;i++) cin>>a[i];
 		for(int i=0;i<n;i++) cin>>b[i],a[i]=abs(a[i]-b[i]);
 		sov(++cas);
 	}
 }