题意:给定一些个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);
}
}
浙公网安备 33010602011771号