【NAOI】blackBOX
预估难度 水蓝
题目描述
给定无限长的,周期长度为 \(n\) 的非负整数序列 \(a\) 的前 \(n\) 项 \(a_1,a_2,⋯ ,a_n\)。
给定无限长的,周期长度为 \(m\) 的非负整数序列 \(b\) 的前 \(m\) 项 \(b_1,b_2,⋯ ,b_m\)。
给定整数 \(k\),求出:
\[\biggl(\sum^{k}_{i=1}\sum^{k}_{j=1}a_i \oplus b_j\biggr) \pmod {10^9+7}。
\]
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,mod=1e9+7,siz=64;
int n,m,k,a[N],b[N],ans,w[100];
void solve(int m){
for(int i=1;i<=m;i++){
for(int j=0;j<siz;j++){
if((b[i]>>j)%2==1) w[j]=(w[j]+1)%mod;
}
}
}
int mak(int n){
int ans=0;
for(int i=1;i<=n;i++){
for(int j=0;j<siz;j++){
if((a[i]>>j)%2==0) ans=(ans+(1ll<<j)*w[j])%mod;
else ans=((ans+(1ll<<j)*(k-w[j])%mod)%mod+mod)%mod;
}
}
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
if(k>=m){
solve(m);
if(k>=m*2ll){
for(int i=0;i<siz;i++){
w[i]=(w[i]*(k/m)%mod+mod)%mod;
}
}
}
solve(k%m);
if(k>=n){
ans=mak(n);
if(k>=n*2ll) ans=(ans*(k/n))%mod;
}
ans=(ans+mak(k%n))%mod;
cout<<ans;
return 0;
}

浙公网安备 33010602011771号